用位运算实现两个整数的加减乘除运算
来源:互联网 发布:淘宝如何评价卖家 编辑:程序博客网 时间:2024/06/02 13:38
位运算的思想可以应用到很多地方,这里简单的总结一下用位运算来实现整数的四则运算。
在不同的位上加1,那就是从相应的位开始向左计算,右边不变。
下面还有一个网上的思路,我觉得这个更好:
1.整数加法
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 ; }我的思路主要是利用a+1的位运算就是最左端(从第0位开始向左)连续的1变为0,原先a中为0的位置最低那一位变为1。
在不同的位上加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; }上面的思路就是先不计进位相加,然后再与进位相加,随着递归,进位会变为0,递归结束。
2.整数减法
这个和加法一样了,首先取减数的补码,然后相加。
int Minus(int a,int b) { int i; for(i = 1; i && ((b & i) ==0 ); i <<= 1) ; for(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;}
- 用位运算实现两个整数的加减乘除运算
- 用位运算实现两个整数的加减乘除运算
- 用位运算实现两个整数的加减乘除运算
- 用位运算实现两个整数的加减乘除运算
- 用位运算实现两个整数的加减乘除运算
- 用位运算实现两个整数的加减乘除运算
- 用位运算实现两个整数的加减乘除运算
- 用位运算实现两个整数的加减乘除运算
- 用位运算实现两个整数的加减乘除运算
- 用位运算实现两个整数的加减乘除
- 用位运算实现两个整数的加减乘除
- 用位运算实现两个整数的加减乘除
- 用位运算实现整数的加减乘除运算
- 位运算实现整数的加减乘除
- 位运算实现整数加减乘除
- 位运算---只使用位运算实现整数的加减乘除
- 只用位运算实现整数的加减乘除运算
- 只用位运算实现整数的加减乘除运算
- Latex中编译顺序
- Mac OS
- 开始冷淡
- 互联网进化论简要介绍
- Darwin
- 用位运算实现两个整数的加减乘除运算
- 浅析Hibernate中的多表查询
- FreeBSD
- JQuery.Ajax之错误调试帮助信息
- 项目管理之路(二)--认同与不认同
- 互联网启示:从生命起源到智慧宇宙的进化全景图
- Minix
- Eclipse插件大全
- 创建maven工程