用位运算实现两个整数的加减乘除运算
来源:互联网 发布:微信mac客户端下载 编辑:程序博客网 时间:2024/05/17 23:35
位运算的思想可以应用到很多地方,这里简单的总结一下用位运算来实现整数的四则运算。
.整数加法
- int Add(int a,int b)
- {
- for(int i = 1; i; i <<= 1)
- if(b & i)
- for(int j = i; j; j <<= 1)
- if(a & j) a &= ~j;
- else {a |= j; break;}
- return a ;
- }
在不同的位上加1,那就是从相应的位开始向左计算,右边不变。
下面还有一个网上的思路,我觉得这个更好:
- int Add(int a,int b)
- {
- if(b == 0) return a;//没有进位的时候完成运算
- int sum,carry;
- sum = a ^ b;//完成第一步没有进位的加法运算
- carry=(a & b) << 1;//完成第二步进位并且左移运算
- return Add(sum,carry);//进行递归,相加
- }
- int Add(int a,int b) { return b ? Add(a ^ b,(a & b) <<1 ): a; }
2.整数减法
这个和加法一样了,首先取减数的补码,然后相加。
- int Minus(int a,int b)
- {
- for(int i = 1; i && ((b & i) ==0 ); i <<= 1)
- ;
- for(int i <<= 1; i; i <<=1 )
- b ^= i;
- return Add(a,b);
- }
3.整数乘法
乘法就是将乘数写成(2^0)*k0 + (2^1)*k1 + (2 ^2)*k2 + ... + (2^31)*k31,其中ki为0或1,然后利用位运算和加法就可以了。
- int Mul(int a,int b)
- {
- int ans = 0;
- for(int i = 1; i; i <<= 1, a <<= 1)
- if(b & i)
- ans += a;
- return ans;
- }
4.整数除法
除法就是由乘法的过程逆推,依次减掉(如果够减的话)divisor << 31、divisor << 30、... 、divisor << 2、divisor << 1、divisor(要保证不能溢出)减掉相应数量的除数就在结果加上相应的数量。
- int Div(int dividend, int divisor)
- {
- // assert(divisor != 0)
- int sign = 1;
- if(dividend < 0 && divisor > 0 || dividend > 0 && divisor < 0)
- sign = -1;
- unsigned int x = (unsigned int)abs(dividend);
- unsigned int y = (unsigned int)abs(divisor);
- int bitCnt = sizeof(int) << 3;
- int quotient = 0;
- int k = bitCnt-1;
- while(((1 << k) & y) == 0) k--;
- for(int j = bitCnt-1-k; j >= 0; j--)
- {
- if(x >= (y << j))
- {
- x -= (y << j);
- quotient += (1 << j);
- }
- }
- return sign*quotient;
- }
0 0
- 用位运算实现两个整数的加减乘除运算
- 用位运算实现两个整数的加减乘除运算
- 用位运算实现两个整数的加减乘除运算
- 用位运算实现两个整数的加减乘除运算
- 用位运算实现两个整数的加减乘除运算
- 用位运算实现两个整数的加减乘除运算
- 用位运算实现两个整数的加减乘除运算
- 用位运算实现两个整数的加减乘除运算
- 用位运算实现两个整数的加减乘除运算
- 用位运算实现两个整数的加减乘除
- 用位运算实现两个整数的加减乘除
- 用位运算实现两个整数的加减乘除
- 用位运算实现整数的加减乘除运算
- 位运算实现整数的加减乘除
- 位运算实现整数加减乘除
- 位运算---只使用位运算实现整数的加减乘除
- 只用位运算实现整数的加减乘除运算
- 只用位运算实现整数的加减乘除运算
- 类设计简单实例
- struts2 拦截器
- 排序算法一之冒泡 选择 插入 希尔排序
- 运算符优先级和关联性
- 人月神话读后感
- 用位运算实现两个整数的加减乘除运算
- HDU 携程编程大赛 1003 携程全球数据中心建设 水题
- java设计模式示例
- 大话数据结构之第一章数据结构绪论总结
- 编程之路能不能走下去
- Android下的动画处理
- sqlite 数据库 boolean类型的小小测试
- C++primer plus第六版课后编程题答案8.5
- 【Burnside引理】疫苗