牛客上的一道题:不用加减乘除做加法_牛客题霸_牛客网
题目描述:
这道题需要用到移位操作符和位操作符(关于这些操作符可见之前的内容,链接在这里:http://t.csdnimg.cn/Vjp3D),我们先从简单的加法开始,如果两个数相加不需要进位,例如0101(即5)和0010(即2),我们可以直接通过异或(即^)得到。
但如果需要进位的两个数字又应当如何做呢?在十进制的加法中,满十我们会向前进一位,在二进制中亦是如此,满二进一,我们可以先得到相同位都为1的位(通过&得到),然后左移一位,就是实现了进位,然后将其与相同位一个为1,一个为0的相加即可。但是这样可能并不是一次就可以的,需要用循环来实现,当得到的进位后的数为0,即不需要再进位时就得到了最终的数字。
接下来通过举例子来帮助理解:以5+7为例
代码实现:
int Add(int num1, int num2 ) {
int tmp = 0;
while(num2 != 0)
{
tmp = num1 ^ num2; //得到每位相加,不考虑需要进位的数据
num2 = (num1 & num2) << 1; //都为1 进位
num1 = tmp;
}
return num1;
}