https://www.nowcoder.com/practice/59ac416b4b944300b617d4f7f111b215?tpId=13&tqId=11201&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
| 日期 | 是否一次通过 | comment |
|----|----|----|
|2019-01-26 13:20|N|对位运算理解不够:异或表示非进位的加法,与表示进位|
|2019-01-27 13:20|N|递归方法没写好|
题目:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
解法:
对于二进制的加法运算,若不考虑进位,则 1+1=0,1+0=1,0+1=1,0+0=0,不难发现,结果等同于异或运算
。因而排除进位,加法可用异或来实现。然后考虑进位,0+0 进位为 0,1+0 进位为 0,0+1 进位为 0,1+1 进位为1,结果等同于与运算
。
1. 递归
public class Solution {
public int Add(int num1,int num2) { // (结果,进位)
if((num1 & num2) == 0) {
return num1 ^ num2;
}
return Add(num1 ^ num2, (num1 & num2) << 1); // 注意下符号优先级,移位的优先级高于与
}
}
2.非递归
public class Solution {
public int Add(int num1,int num2) {
while(num2 != 0) {
int num = num1 ^ num2;
int carry = (num1 & num2)<<1;
num1 = num;
num2 = carry;
}
return num1;
}
}