371.[LeetCode]Sum of Two

本文介绍了一种使用位运算实现加法的方法。通过与运算计算进位,利用异或运算得出不考虑进位情况下的结果,并不断迭代直至没有进位。这种算法避免了直接使用加法运算符,展示了位操作的独特魅力。

这确实是一道简单的加法题,但是却实际上考察了 面试者的深度,一道加法题能玩出怎么的花样呢?

那就是 位运算

位运算有哪些呢?

与 & 就是一般的与 0101&0001 = 0001
异或 ^ 同0异1 0101^0001 = 0100
非 ~ 取反 ~0001 = 1110
<< >> 分别是左右移位 0010 << 1 = 0100 左移一位

那么如何用位运算计算加法呢?

也即是说 二进制的加法是怎么样的呢?

二进制的就算可以说是一直重复的两个步骤:

  1. 与运算,carry = a&b << 1, 这一步算出来的 进位,(因为只有两个数的某一个位置都是1的时候才会进位,所以用与运算,)(因为是进位,所以要左移一位)

  2. 异或运算,只有 a ^= b, 这一步是计算不考虑进位的情况下,a 和 b的值,应该是多少,(只有当10或01的情况下,本位才有可能是0)

  3. 之后判断carry是否为空,如果carry不为空,则用现在的结果 再去加 carry,重复1,2,3,直到carry为空

public class Solution {
    public int getSum(int a, int b) {
        while (b != 0) {
            int c = a & b; //carry
            a ^= b; //add 
            b = c << 1;
        }
        return a;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值