题目:
Calculate the sum of two integers a and b, but you are not allowed to use the operator +
and -
.
Example:
Given a = 1 and b = 2, return 3.
思路:
位运算
假设a=010010, b=100111, 则a^b = 110101, 可以得到对应位为0,1和0,0相加的结果,忽略了1,1相加的情况;
那么就要看有木有1,1相加的对应位,与运算正好可以满足此需求。
a&b = 000010 ,说明倒数第二位相加后会产生进位,但是进位会进到倒数第三位上,故(a&b)<<1 可以得到是哪位有进位。
如果(a&b)<<1 为0了,说明已经没有进位,则a^b即为a+b的结果。
如果(a&b)<<1不为0,说明有进位,则继续将a^b和(a&b)<<1的结果进行异或和与,处理结果如上。
实现代码(C语言):
int getSum(int a, int b) {
if(a == 0)
return b;
if(b == 0)
return a;
int tempA = 0;
while(b)
{
tempA = a ^ b;
b = (a & b) << 1;
a = tempA;
}
return a;
}
位运算的其它用法:
1.计算两个数的平均值:对于两个整数x,y,avg = (x+y)/2, 但是x+y有可能超出整数所能表示的数值的最大范围,我们又知道平均值肯定不会超出最大值的,故用位运算。