LeetCode-剑指Offer 65-不用加减乘除做加法
Posted LHlucky_2
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode-剑指Offer 65-不用加减乘除做加法相关的知识,希望对你有一定的参考价值。
1. 题目描述
2. 题目链接
剑指 Offer 65-不用加减乘除做加法:->link
3. 题解思路
a=2 b=3为例子
:
- 既然不允许用+、-、*、/四则运算符号,那么大家肯定会想到这时候用& , ^ , << , >> , |这些按位运算符来操作了。
- 相加各位的值(ret),不算进位,得到ret,二进制每位相加就相当于各位做异或( ^ )操作,0010^0011。
- 计算进位值(carry),相当于各位做与( & )操作,再向左移一位( << ),(0010&0010) << 1。
- 重复上述两步,让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. 注释详解
- ret: 表示最终结果
- carry :表示两数的进位
- 如果 b == 0 则让ret = a;说明是 a + 0,让ret = a,最终返回ret。while判断时判断的是 b 值,所以不用考虑a。如果 b 为 0,则不会进入循环,最终统一返回结果ret。
- (unsigned int)注意c++不支持负数移位, 所以先强制类型转换为无符号数(unsigned int)。
以上是关于LeetCode-剑指Offer 65-不用加减乘除做加法的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode(剑指 Offer)- 65. 不用加减乘除做加法
LeetCode(剑指 Offer)- 65. 不用加减乘除做加法
[LeetCode]剑指 Offer 65. 不用加减乘除做加法
剑指 Offer 65. 不用加减乘除做加法(位运算,Java)