位运算加法:
首先不考虑进位进行相加,结果为001111010,该结果其实就是a ^ b。
再考虑进位的产生值,结果为000001010,该结果其实就是(a & b)<< 1。
将1、2产生的结果再相加,此时依然要考虑两部分:不考虑进位和只考虑进位。
一直重复上述步骤,直到进位产生的值全部消失。
int getSum(int a, int b)
{
if(a == 0)
return b;
if(b == 0)
return a;
int lower; //低位
int carrier; //进位
while(true)
{
lower = a ^ b; //计算低位,即无进位的加法的结果
carrier = (a & b) << 1; //计算进位
if(carrier == 0)
break;
//如果进位不等于0,将无进位加法结果和进位相加
a = lower;
b = carrier;
}
return lower;
}
位运算减法:
实现a - b只要实现a + (-b)即可。所以只要将a和b的相反数调用add函数就行。根据二进制数在机器中表达的规则,得到一个数的相反数,就是这个数的二进制数表达取反加1(补码)的结果。
int sub(int a, int b)
{
return add(a, add(~b, 1));
}
参考链接1:https://blog.csdn.net/mikasoi/article/details/105030551