用加减乘除实现位运算

就是怎么能用四则运算,仅限加减乘除,实现从数据中(比方说32bit)筛选出指定的两位数据,并表示成0、1、2或3(2bit所能表达的数据)。比方说数据源(用D0表示)D0=1,说明第一个信息是1,D0=5,说明至少有两个信息,第一个为1,第二个也为1,D0=14,,说明至少有两个信息,第一个为3,第二个为2。求高手解答,谢谢!
问题补充,没有强制类型转换,比方说(int)(float)等都没有的,程序默认是四舍五入。还有,不是用C等编程语言,就是直接的用四则运算。

首先 要知道是要取多少位,比如是1 3两位
这里要做一个约定,就是从低位开始标记,从0下标开始 D0 D1 ... D20...D31(假设总位数32位)
这个约定很重要,不然没法说明白了
然后,程序默认是四舍五入,这个比较麻烦,因为计算的时候要做到的是无条件舍去
所以在做除法的时候先减去被除数一半
设原始数为A

计算过程
提取Di
中间变量x
x= (A-2^(i-1))/(2^i) 这一步操作相当于A>>i
判断x是奇数还是偶数,如果是奇数 那么Di=1,否则Di=0
如果不支持%的话,再由于四舍五入的特性 可以判断
x/2*2==x 如果是奇数 那么x/2*2会是x+1,是偶数则相等
这样就提取出来Di了

合成两位数就简单了
假设提取Di Dj i>j
那么最终的数R=Di*2+Dj

例子:
设原始数字为110 提取D1 D3
D1=(110-2^(0))/(2^1)=(110-1)/2=54.5=55
奇数 D1=1
D3=(110-2^(2))/(2^3)=(110-4)/8=13.25=13
奇数
D3=1

结果R=1*2+1=3追问

你还有2^(i),你够厉害,你要我写多少个2相乘啊?
我这很明显是两位两位的取,D0.0 D0.1一组D0.2 D0.3一组
而且你这过程太多。

追答

如果固定两位一组的话 那就更简单了
直接除就可以了
至于2^i这个,支持数组不? 支持的话 直接建立一个数组,把2^0 -> 2^31写在里面,直接调用就行了
如果不支持,那就分情况,直接把2^i写程序里面

说实话 你提问的很不清晰
至少我没看到哪里有说要连续两位一组,所以我只能按位来
另外,你说四舍五入,那么运算结果要保留几位小数?还是没有小数?
有没有取整运算?
提供的信息越多,才会有更适合的算法,否则算法就会很复杂

追问

不是算法,不能用编程语言实现。
系统有保留小数,至于多少位不知道,但是默认是四舍五入的,这是我测试出来的。
软件里有这些东西:加减乘除四个元件。然后源数据是可以读取的。读取出来之后就需要取位操作了。连续两位两位的取。
不支持数组。就源,加减乘除。而且源还不能被修改。就这样。还有什么问题问吧。

追答

做运算的时候,比如加或者乘 会溢出吗?
比如32768*32768*32768*32768*32768这样的运算 结果是多少?

追问

应该会吧,哪有不溢出啊?

追答

那就需要判断多少位会溢出了,因为有些运算,只能靠溢出来计算了
话说,你这个是什么软件啊? 大吗?
方便的话 发给我实际测一下,能快很多

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-07-12
要分两步,第一步是转换成四进制,
第二步是取余
这两步都能用四则运算实现,很简单

不过你没有说清楚你的四则运算里的除法是整除,还是带小数的。如果带小数的话,很遗憾的告诉你,不可能。整除的话我可以跟你说追问

    什么是四进制

    四则运算怎么取余数?

    不要告诉我4/3=1....1机器就只认商,除了+、-、*、/一概不认。

    恭喜你答对了,带小数的。

追答

除法是带小数的话,那可以判断吗,判断上一步的结果是大于0还是小于0

追问

你还是没回答问题

追答

我突然发现 你的提问是说四舍五入的,怎么回答我的追问又变成带小数的了??

追问

不带小数怎么四舍五入?

第2个回答  2013-07-18
//写得详细的你不采纳
//给两个个公式吧
//最低两位数据 f(x) = x - (x / 4 - x /
4 * 4 / (x * 2)) * 4
//次低两位数据 g(x) = ((x - (x / 16 -
x / 16 * 16 / (x * 2)) * 16) - (x - (x /
4 - x / 4 * 4 / (x * 2)) * 4)) / 4
//完全符合你的要求
//再不采纳就没意思啦
相似回答