基本性质:1:~n=-(n+1),比如:~3=-4
2:获取整数n的二进制串中最后一个1:-n&n=~(n-1)&n
3:去掉整数n的二进制串中最后一个1:n&(n-1)
加法:(以下所有代码都是Java实现)
public static int add(int a,int b) {
int res=a;
int xor=a^b; // a^b得到原位和(相当于按位相加没有进位)
int forward=(a&b)<<1;//得到进位和 a&b:得到产生进位的地方 (a&b)<<1:进位后的值
if(forward!=0){//若进位和不为0,则递归求原位和+进位和
res=add(xor, forward);
}else{
res=xor;//若进位和为0,则此时原位和为所求和
}
return res;
}
减法:
public static int minus(int a,int b) {
int B=~(b-1); // 由上面基本性质 -b=+(-b),~(b-1)=-b ===>>> a-b=a+(-b)=a+(~(b-1)
return add(a, B);
}
乘法:
public static int multi(int a,int b){
/* 1011
* 1010
--------
10110 (1011<<1,相当于乘以0010)
1011000 (1011<<3,相当于乘以1000)
--------
1101110
*/
int i=0;
int res=0;
while(b!=0){//乘数为0则结束
//处理乘数当前位
if((b&1)==1){
res+=(a<
b=b>>1;
++i;//i记录当前位是第几位
}else{
b=b>>1;
++i;
}
}
return res;
}
除法:
public static int sub(int a,int b) {
// 除法的意义就在于:求a可以由多少个b组成。那么由此我们可得除法的实现:求a能减去多少个b,做减法的次数就是除法的商。
int res=-1;
if(a
return 0;
}else{
res=sub(minus(a, b), b)+1;
}
return res;
}
测试代码:
public static void main(String args[]){
System.out.println("加法测试:"+add(10, 5));
System.out.println("减法测试:"+minus(10, 5));
System.out.println("乘法测试:"+multi(10, 5));
System.out.println("除法测试:"+sub(10, 5));
}
测试结果: