当前位置 博文首页 > 中流击水,浪遏飞舟:位运算实现加法&&剑指 Offer 65.

    中流击水,浪遏飞舟:位运算实现加法&&剑指 Offer 65.

    作者:[db:作者] 时间:2021-08-26 12:42

    a + b = (a ^ b) ^ ((a & b)) << 1;循环至进位数为0为止。

    abn(无进位和)c(进位)
    0000
    0110
    1010
    1101

    参考了大佬的题解:
    面试题65. 不用加减乘除做加法(位运算,清晰图解)

    1.java提交可以过

    class Solution {
        public int add(int a, int b) {
            while(b!=0){
                int c=(a & b)<<1;
                a ^= b;
                b = c;
            }
            return a;
        }
    }
    

    2.c++按以上代码提交过不了,因为有负数时左移会溢出,故要加 unsigned int强制类型转换

    参考了力扣c++题解别人的处理方法。

    class Solution {
    public:
        int add(int a, int b) {
            while(b){
                int c = a & b;
                c = (unsigned int)c<<1;     //有负数时不强转会溢出,故需要转换为无符号整数
                a ^= b;
                b = c;
            }
            return a;
        }
    };
    

    3.c++递归版本,原理差不多

    参考了力扣评论区

    class Solution {
    public:
        int add(int a, int b) {
            return b==0?a:add(a^b,(unsigned int)(a&b)<<1);
        }
    };
    
    cs