【LeetCode剑指offer65】不用加减乘除做加法(位运算)

一、题目

在这里插入图片描述

二、思路

  • (a & b) << 1能够计算a和b的所有进位值;
  • a ^ b则是计算a和b的各位相加(不管进位值)
  • 因为不能使用加法运算符,所以上面两项的结果也不能用加法,只能循环上面的步骤计算。

回顾常用的位运算:

  • 使用位运算 ( x > > i ) (x >> i) (x>>i) & 1 1 1 得到 x 的第 i 个二进制位。
  • n & (n - 1)可以将n的二进制位的最低位1移除。如1000和0111做与运算后得到0000,即将1000的最低位的1移除了。
  • n & (-n)即n与其相反数做与运算。由于负数是按照补码规则在计算机中存储的,−n 的二进制表示为 n 的二进制表示的每一位取反再加上 1。
  • 有关n & (-n)的结论:如果n是真整数n & (-n) == n,则n是2的幂。

三、代码

class Solution {
    
    
public:
    int add(int temp_sum, int jinwei) {
    
    
        //不能使用+号,所以求出异或部分和进位部分后依然不能使用+号
        //所以只能循环到没有进位为止
        while(jinwei != 0){
    
    
            //进位为0则停止循环
            //计算进位
            int a = (unsigned int)(temp_sum & jinwei) << 1;
            //各位相加,不算进位
            temp_sum = temp_sum ^ jinwei;
            jinwei = a;
        }
        return temp_sum;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_35812205/article/details/123983099
今日推荐