【001】A+B问题

问题描述:在不使用运算符的情况下,实现简单的A+B问题。
重点:

  1. 不使用常规运算符 【+-×/】
  2. 计算A+B的值

主要考点:

  1. 二进制位运算
  2. 相关位运算符的使用
  3. 进位计算的基础知识点

算法公式:

  1. a+b = (a ^ b) + ( (a & b ) << 1 )
  2. sum = a ^ b;carryBit =(a & b ) << 1
  3. 则可以得到:a+b=sum+carryBit
  4. 由二进制进位规则可知,carryBit在N次进位后,最终值终为0,则式1可简化为a+b=sum+(0)
  5. 由4可知未知数N在carryBit不为0(carryBit始终为正整数)时始终有解
  6. 以此可得出最终结论:a + b = N(由(a & b )进位可得)= 0 => a ^ b

实现代码:

public int aplusb(int a,int b){
        while(b!=0){
            /**
             *  a^b(a异或b:a,b中不同则为1,相同则为0)
             *  即13^9 = 【前位补0】100 =  4,不考虑进位
             */
            int sum = a^b; 
            /**
             *  a&b(a位与b:a,b中相同则为1,不同则为0)
             *  即13+9 = 【前位补0】1001 = 9,只考虑进位
             *  不论位与的结果值大值小,进位的最终值始终为0,所以只需要循环进位至0即可
             */
            int carryBit = (a&b) << 1;

            /**
             *  当carryBit进位至0时,a^b即是a+b最终的结果
             */
            a=sum;
            b=carryBit;
       }
       return a;
}

运算结果:

//第一次运算
a^b:4
(a&b) << 1:18
toBinary a^b:100
toBinary (a&b) << 1:10010
//第二次运算
a^b:22
(a&b) << 1:0
toBinary a^b  :10110
toBinary (a&b) << 1:0

result = 22

你可能感兴趣的:(【001】A+B问题)