计算a+b,不使用+等运算符
2018-10-24 本文已影响0人
无端飞溅
上周面试的时候,问了一个同学上什么网站刷题,于是知道了lintcode
今天抽空登录上去找了个最简单的题看了下,就是这个a+b问题了:
给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符。
不能使用运算符,首先想到就是用位操作符,但是要怎么把位操作转化为加法运算,一时之间还真没有头绪,随后想到最直观的就是转换二进制为字符串,再对每个位的字符串进行相应操作然后再转换回数字即可,但是这种实现必然是不优雅的。于是上网搜索了答案:
int aplusb(int a, int b) {
int ret = 0;
int temp = 0;
while (0 != b)
{
ret = a ^ b;
temp = (a&b) << 1;
a = ret;
b = temp;
}
return ret;
}
二进制加法的位运算实现规则:
- 都为1或者0则当前位为0,分别为1或0,则当前位为1,这是一个异或操作
- 都为1时,则高位进1
- 由此得到方法,首先a^b,得出当前位的状态,然后a&b左移1位得出进位状态,每次循环都是为了得出需要进位的结果
- 当b为0时则无进位状态,即为最终结果