1.整数的加法
我的思路主要是利用a+1的位运算就是最左端(从第0位开始向左)连续的1变为0,原先a中为0的位置最低那一位变为1。
- int MyAdd(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 AddWithoutArithmetic(int num1,int num2)
- {
- if(num2==0) return num1;//没有进位的时候完成运算
- int sum,carry;
- sum=num1^num2;//完成第一步没有进位的加法运算
- carry=(num1&num2)<<1;//完成第二步进位并且左移运算
- return AddWithoutArithmetic(sum,carry);//进行递归,相加
- }
上面的思路就是先不计进位相加,然后再与进位相加,随着递归,进位会变为0,递归结束。
2.整数的减法
这个和加法一样了,首先取减数的补码,然后相加。
3.整数的乘法
乘法就是将乘数写成(2^0)*k0 + (2^1)*k1 + (2 ^2)*k2 + ... + (2^31)*k31,其中ki为0或1,然后利用位运算和加法就可以了。
- int MyMul(int a,int b) { int ans=0; for(int i=1;i;i<<=1,a<<=1) if(b&i) ans+=a; return ans; }
4.整数除法(正整数)
除法就是由乘法的过程逆推,依次减掉(如果x够减的)y^(2^31),y^(2^30),...y^8,y^4,y^2,y^1。减掉相应数量的y就在结果加上相应的数量。
转自
http://blog.csdn.net/walkinginthewind/article/details/6886489