Leetcode 上看到一道很有意思的题,如何不用“+”和“-”来实现数字的加减运算。
既然不能用“+”和“-”,那么只能用位运算来做了,毕竟追本朔源所有的运算都是由位运算实现的。
由于二进制每一位只有0和1两个状态,因此每一位只有四种可能的运算,分别是:
(1)0+0=0;
(2)1+0=1;
(3)0+1=1;
(4)1+1=0;
我们找找规律就能发现,其实就是对每一位进行了异或^操作。
我们还可以发现只有运算(4)有了进位,由于只有当(1,1)时才有进位,我们可以用与&操作来保存进位。
因此,A+B可以先转化为A^B和A&B两个值,由于A&B是进位值,因此需要整体向前移动一位才算进位,如此一来就得到加法的第一步转化公式:
A+B=A^B+(A&B)<<1;
01+01=00+10;(二进制表示)
我们将^和&操作获得的值重新赋给A和B,利用公式不断将A+B进行转化,直到B=0也就是没有进位时加法才算完成了。如下:
(1) A'=A^B;
B'=(A&B)<<1;
(2) A=A'
B=B'
(3) 判断B是否为0,不为0则重新执行(1)
来看个具体的例子: