计算a+b的值但不能用+等运算符号,letCode的中一道题,

直接先贴代码
java

public class Test {
    public static void main(String[] args) {
        int a=22;
        int b=-29;
        while(b!=0){
            int Temp=a^b;
            b=(a&b)<<1; //有进位的值
            a=Temp;  //无进位的值
        }
        System.out.println("a+b="+a);
    }
}


下面我来叙述道理是什么,算法

首先咱们看一下十进制的计算。ide

7+9=16;spa

7+9的个位为6 个位相加产生进位为1,咱们用进位乘10 在加上个位值6.it


那么咱们如何计算2进制的呢,class

如计算7+5循环

7用二进制表示为0111,而5表示为0101,二进制

  0111static

+ 0101di

这时候咱们的须要把进位算出来,只有1+1的状况下才有进位,因此咱们就能够用&逻辑与的运算符。(0111)&(0101)=0101

因此进位的值为0101,

二进制对应值    8 4 2 1

二进制          0 1 0 1 

因此咱们只须要先算有进位的那些位的相加和为 4*2+1*2,用移位操做符为 (0101)<<1 =4*2+1*2.

到此咱们已经计算完了能够产生进位的那些位相加的和。

而后咱们计算没有产生进位的那些位的和。咱们知道对应位为0,则加为0,对应位一个为1一个为0,得结果为1.咱们就能够用异或运算,相同为0,不一样为1。这样咱们就把产生进位的那些全屏蔽为0了。

(0101)^(0111)=0010.这时候对应的十进制位2,


咱们能够看出这两部分相加,((0111)&(0101))<<1 + (0101)^(0111)=(4*2+1*2)+2=12.计算结果正确。可是咱们不让用加怎么办呢?


咱们就继续循环采用上述算法,直到进位值左移为0,意思就是没有进位了。

相关文章
相关标签/搜索