【剑指offer】【位运算】65. 不用加减乘除做加法

题目链接:https://leetcode-cn.com/problems/bu-yong-jia-jian-cheng-chu-zuo-jia-fa-lcof/

位运算

分析十进制是如何做加法的?以5 + 17为例说明
1. 只做各位相加不进位 个位:5 + 7 = 12, 不要进位是2,十位: 0 + 1 = 1; 结果为 12;
2. 做进位 只有十位有进位;结果为10;
3. 将第一步和第二步的结果相加 10 + 12 = 22;

与&:都为1,结果才为1,否则结果为0;
或|:只要有一个为1,结果则为1,否则为0;
非~:取反,原来为0,结果为1,原来为1,结果为0;
异或^ :两个数相同结果为0,不相同结果为1;
以A + B = CD为例;C为高位,D为低位
A 0 0 1 1
B 0 1 0 1
C 0 0 0 1 与实现
D 0 1 1 0 异或实现

把二进制的加法用位运算来替代
1) 不考虑进位对每一位相加,
0 + 0 = 0;
1 + 0 = 1;
1 + 1 = 0;
0 + 1 = 1;
此结果与没有异或结果一样;
2) 算进位的和
0 + 1, 1 + 0, 0 + 0都没有进位
只有1 + 1有进位 1 + 1 = 10
相当于两位数进行与运算,然后左移一位;
3) 把前两个步骤的结果相加
第3)步就是重复1)和2),直到不再产生进位位置

注意:C++不支持负值左移!!所以左移之前先转化为unsigned int

class Solution {
public:
    int add(int a, int b) {
        while(b){
            int sum = a ^ b;
            int carray = ((unsigned int)(a & b) << 1);
            a = sum;
            b = carray;
        }
        return a;
    }
};
posted @ 2020-04-20 15:57  NaughtyCoder  阅读(100)  评论(0)    收藏  举报