【2错-2】不用加号求两数之和

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;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容