【剑指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;
}
};
知识的价值不在于占有,而在于使用