用加减乘除实现位运算

就是怎么能用四则运算,仅限加减乘除,实现从数据中(比方说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
//完全符合你的要求
//再不采纳就没意思啦

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

c语言的加减乘除是怎么实现的
本质上都是位运算。 加法通过异或、且和左移递归实现。设a,b为两个二进制数,则a+b = a^b + (a&b)<<1;典型的实现代码:\/\/递归版本的加法int Add(int a, int b){ return b ? Add(a^b, (a&b)<<1) : a; }\/\/迭代版本int Add_iter(int a, int b){ int ans; ...

Python中的常见运算符
1、算术运算符用于执行加减乘除、取余等操作。例如,使用斜杠"\/"执行除法,两个整数相除结果为小数,若需整除结果,应使用两个斜杠"\/\/"。使用两个"**"进行幂运算。2、关系运算符用于比较操作数大小,返回True或False。等号"=="用于判断是否相等,一个等号用于赋值。Python支持连续关系比较,如判断数值...

两个变量的交换,如何用加减乘除来完成?
a = a^b;b = a^b;a = a^b;3、乘除法:可以处理整型和浮点型变量,但在处理浮点型变量时也存在精度损失问题。而且乘除法比加减法要多一条约束:b必不为0。a = a * b b = a \/ b a = a \/ b 其中加减,乘除容易越界,用位运算异或效率最高,且不会越界。使用位运算交换两个数,...

运算器的主要功能是
算术运算是运算器中最基本的运算,它包括加法、减法、乘法和除法等基本运算。在执行算术操作时,电子元件利用二进制数码表示数据,并通过逻辑电路的组合实现加减乘除四种基本运算。算术运算也是计算器中最常用的功能之一,无论是从基本的计算到复杂的数据分析,都需要进行算术运算。逻辑运算 逻辑运算是处理数字...

加减乘运算都是从低位开始,为何除法要从高位开始计算?
加减乘除是4则基本的运算法则,基本都是从低位开始算,但是除法是从高位开始算,因为我们要清楚加减乘除,它其实就是两个体系加减,一个是正向的,一个是逆向的,乘除也是一个是正向的,一个是逆向的。我们可以简单的把乘除理解成一个体系,因为除法某种程度上来说,它就是乘法的逆运算,两者是等价的...

...算术运算符|比较运算符|逻辑运算符|位运算符
1. 算术运算符基础的加减乘除等我们熟知的运算符,Python提供了以下功能:加法 (+):相加两个数。减法 (-):从第一个数减去第二个。乘法 (*):两个数相乘。除法 (\/):除法运算,结果通常是浮点数。取余 (%): 返回除法后的余数。幂运算 (**):底数乘以指数次。整除 (\/\/): 向下取整除法。

C语言中按位运算符之间有没有类似数学上加减乘除的运
加减乘除 用+-*\/就可以了 位运算只有~&|^。用位运算可以模拟加减乘除,不过 很麻烦罢了

C语言基础:运算符和表达式
算术运算符包括加减乘除,如加法(+,双目运算,遵循右结合性)、减法(-,可作负数运算符)、乘法(*)和除法(\/,左结合性)。取余运算符(%)要求参与数为整数,同样左结合。复杂的算数表达式如2 + 4 - 8 % 3,遵循“先乘除后加减”的原则,涉及运算符优先级和结合性。关系运算与表达式 关系运算符...

cpu是怎么做加法和减法的?
计算机CPU加,减,乘,除的原理 对于计算机实现加减乘除的研究记录,如有错误还请指出 1.加法计算机的加法就如同我们的数学计算一样,只不过是进制变成了2进制,需要满2进一,如5+3,二进制表示则是 0101 0011 --- 1000 加法的实现由按位加和(异或)和进位(与)两部分组成,内部的实现就是加法...

相似回答