位操作实现加减乘除四则运算
2015-03-23 11:43
232 查看
解决方案
需要熟练掌握一些常见的位操作实现,具体为:1)常用的等式:-n=~(n-1)=~n+1
2)获取整数n的二进制中最后一个1:n&(-n)或者n&~(n-1)如:n=010100,则-n=101100,n&(-n)=000100
3)去掉整数n的二进制中最后一个1:n&(n-1),如:n=010100,n-1=010011,n&(n-1)=010000
1 利用位运算实现加法
由于我们不能使用任何算术运算符,因此可供我们使用的就只有位运算符了。 于是我们把操作数看成二进制表示,然后对它们做类似的操作:不考虑进位的按位求和,(0,0),(1,1)得0,(1,0),(0,1)得1, 使用异或操作可以满足要求。
只考虑进位,只有(1,1)才会产生进位,使用按位与可以满足要求。 当前位产生进位,要参与高一位的运算,因此按位与后要向左移动一位。
递归求和,直到进位为0
实现代码:
int add(int a,int b) { int carry,add; do{ add=a^b; carry=(a&b)<<1; a=add; b=carry; }while(carry!=0); return add; }
2 减法实现
减法和容易地转换为加法:a-b=a+(-b)=a+(~b+1)int subtract(int a,int b) { return add(a,add(~b,1)); }
3 乘法实现
乘法的实现可以转换成:k31*(2^31)+k30*(2^30)+...+k2*(2^2)+k1*(x^1)+k0*(x^0);其中k0~k31取0或者1//正整数的乘法 int multiply(int a,int b) { int ans=0; while(b) { if(b&1) ans=add(ans,a); a=a<<1; b=b>>1; } return ans; }
4 除法实现
int divide(int a,int b) { int count=0; while(a>=b) { a=subtract(a,b); count=add(count,1); } return count; }
改进的除法:
int div(const int x,const int y) { int left_num=x; int result=0; while(left_num>=y) { int multi=1; while(y*multi<=(left_num>>1)) { multi=multi<<1; } result+=multi; left_num-=y*multi; } return result; }
相关文章推荐
- 只用位运算来实现整数的加减乘除四则运算
- 用位运算实现四则运算之加减乘除
- 用位运算实现四则运算之加减乘除
- 用位运算实现四则运算之加减乘除
- 只用位运算来实现整数的加减乘除四则运算 (转载,还没有来得及整理!!!!)
- 实现复数的加减乘除四则运算的C#类(已测成功)
- 正整数加减乘除四则混合运算求值方法 java实现
- 用位运算实现四则运算之加减乘除(用位运算求一个数的1/3)
- 用位运算实现四则运算之加减乘除
- 使用“位运算”实现“四则运算”之加减乘除
- 用位运算实现四则运算之加减乘除(用位运算求一个数的1/3)
- 位操作实现加减乘除四则运算
- 用位运算实现四则运算之加减乘除
- 用位运算实现四则运算之加减乘除(用位运算求一个数的1/3)
- 正则表达式实现的加减乘除四则运算的计算器
- 用位运算实现四则运算之加减乘除
- 用位运算实现四则运算之加减乘除
- 用位运算实现四则运算之加减乘除(用位运算求一个数的1/3)
- 用位运算实现四则运算之加减乘除
- 用位运算实现四则运算之加减乘除(用位运算求一个数的1/3)