题目描述
题目要求不使用加号减号完成加法。考点是位运算中如何模拟加法,在此记录一下。
思路
两个整数的异或运算可以得到结果的无进位结果,例如:$4 + 5 = 9 , 4 = (0100)_2 , 5 = (0101)_2 , (0100)_2 \oplus (0101)_2 = (0001)_2$。
接着使用与运算得到整数加法中的进位情况,回忆与运算的性质,只有1 & 1 = 1,和二进制加法进位的情况相同。$4 = (0100)_2 , 5 = (0101)_2 , (0100)_2 \& (0101)_2 = (0100)_2$结果表示为1的那位需要进位,但是进位时我们需要把为1的那位的下一位加1,所以这个结果还要左移动1位,之后在与我们的异或后的无进位结果相加即可。当然,这里的相加也是二进制相加。即进行递归操作,由于无进位时与操作总是得到0,而异或有任何数异或0都等于任何数的性质。因此我们判断无需再进位时即可退出递归。
实现
1 | class Solution { |