LeetCode-剑指Offer 65-不用加减乘除做加法

Posted LHlucky_2

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode-剑指Offer 65-不用加减乘除做加法相关的知识,希望对你有一定的参考价值。

1. 题目描述

在这里插入图片描述

2. 题目链接

剑指 Offer 65-不用加减乘除做加法:->link

3. 题解思路

a=2 b=3为例子

  1. 既然不允许用+、-、*、/四则运算符号,那么大家肯定会想到这时候用& , ^ , << , >> , |这些按位运算符来操作了。
  2. 相加各位的值(ret),不算进位,得到ret,二进制每位相加就相当于各位做异或( ^ )操作,0010^0011。
  3. 计算进位值(carry),相当于各位做与( & )操作,再向左移一位( << ),(0010&0010) << 1。
  4. 重复上述两步,让a = ret,b = carry ,进位值为0,跳出循环。ret为最终结果。
    图解
    在这里插入图片描述

4. 代码示例

class Solution {
public:
    int add(int a, int b) {
        int ret = 0;//注释1
        int carry = 0;//注释2
        if(b == 0)//注释3
        {
            ret = a;
        }
        while(b)
        {
            ret = a ^ b;
            carry = (unsigned int)(a & b) << 1;//注释4
            a = ret;
            b = carry;
        }
        return ret;
    }
};

在这里插入图片描述

5. 注释详解

  1. ret: 表示最终结果
  2. carry :表示两数的进位
  3. 如果 b == 0 则让ret = a;说明是 a + 0,让ret = a,最终返回ret。while判断时判断的是 b 值,所以不用考虑a。如果 b 为 0,则不会进入循环,最终统一返回结果ret。
  4. (unsigned int)注意c++不支持负数移位, 所以先强制类型转换为无符号数(unsigned int)。

以上是关于LeetCode-剑指Offer 65-不用加减乘除做加法的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode(剑指 Offer)- 65. 不用加减乘除做加法

LeetCode(剑指 Offer)- 65. 不用加减乘除做加法

[LeetCode]剑指 Offer 65. 不用加减乘除做加法

剑指 Offer 65. 不用加减乘除做加法(位运算,Java)

剑指 Offer 65. 不用加减乘除做加法(位运算,Java)

剑指 Offer 65. 不用加减乘除做加法(位运算,Java)