- 题目来源:w.nowcoder.com/practice/e7e0d226f1e84ba7ab8b28efc6e1aebc
- 题目描述
给定两个int A和B。编写一个函数返回A+B的值,但不得使用+或其他算数运算符。
测试样例:
1,2
返回:3
- 思路
两个数相异或的结果其实就是两个数相加(但其不进行进位)
两个数相与的结果其实就是两个数相加后的进位的值
异或:相异为1 相同为0
与: 同时为1时为1
eg:
3->0011 9->1001
3^9->1010 sum
3&9->0001
(3&9)<<1 0010 B
A=sum=1010
(3^9) ^((3&9)<<1)->1010 sum
1010&0010-> 0010 A&B
0010<<1 0100 (A&B)<<1 B
1010 A
(1010)^(0100) -> 1110 sum
1010&0100-> 0000 B
1110 A
此时 B=0 则不能进行循环 sum=1110=12
- 代码
class UnusualAdd {
public:
int addAB(int A, int B) {
// write code here
int sum=A;
while(B!=0)
{
sum=A^B;
B=(A&B)<<1;
A=sum;
}
return sum;
}
};