[剑指offer]不用加减乘除做加法

[剑指offer]不用加减乘除做加法

剑指offer-不用加减乘除做加法

题目描述

写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。

示例:
输入: a = 1, b = 1
输出: 2

提示:
a, b 均可能是负数或 0
结果不会溢出 32 位整数

解题思路
  • 无进位的求和, 想象10进制下的模拟情况:如19+1=20,无进位求和就是10,而非20,因为它不管进位情况
  • 进位数的和,想象10进制下模拟情况:如9+1=10,得到的进位数为1,而不是10,所以要用<<1向左再移动一位,就变为10了

设两数字的二进制形式 a, b ,其求和 s = a + b,a(i) 代表 a 的二进制第 i 位,则分为以下四种情况:

a[i]b[i]进位和c(i)非进位和n(i)
0000
0101
1010
1110

可以发现 进位和与运算 逻辑相同,非进位和异或运算 逻辑相同,因此无进位和 n 和进位和 c 的计算公式为:
{ n = a ⊕ b a > 0 非 进 位 和 : 异 或 运 算 c = a & b < < 1 a ≤ 0 进 位 : 与 运 算 + 左 移 一 位 \begin{cases} n=a\oplus b \qquad & a \gt 0 非进位和:异或运算 \\ c=a\&b<<1 \qquad & a \le 0 进位:与运算+左移一位 \end{cases} {n=abc=a&b<<1a>0a0+
即可转化为:
( 和 s ) = ( 非 进 位 和 n ) + ( 进 位 和 c ) (和s)=(非进位和n)+(进位和c) s=n+c
在这里插入图片描述

实现代码
class Solution {
public:
    int add(int a, int b) {
        while(b!=0){
            int c=(unsigned int)(a&b)<<1;//进位,C++中负数不支持左移位
            a^=b;//非进位
            b=c;
        }
        return a;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值