A + B 问题(位运算应用2)

题目:

给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符

注意事项:

你不需要从输入流读入数据,只需要根据aplusb的两个参数a和b,计算他们的和并返回就行。

说明:

a和b都是32位整数,可以使用位运算符

样例:

如果 a=1并且 b=2,返回3

代码:

class Solution {
    /*
     * param a: The first integer
     * param b: The second integer
     * return: The sum of a and b
     */
    public int aplusb(int a, int b) {
        // 主要利用异或运算来完成 
        // 异或运算有一个别名叫做:不进位加法
        // 那么a ^ b就是a和b相加之后,该进位的地方不进位的结果
        // 然后下面考虑哪些地方要进位,自然是a和b里都是1的地方
        // a & b就是a和b里都是1的那些位置,a & b << 1 就是进位
        // 之后的结果。所以:a + b = (a ^ b) + (a & b << 1)
        // 令a' = a ^ b, b' = (a & b) << 1
        // 可以知道,这个过程是在模拟加法的运算过程,进位不可能
        // 一直持续,所以b最终会变为0。因此重复做上述操作就可以
        // 求得a + b的值。
        while (b != 0) {
            int _a = a ^ b;
            int _b = (a & b) << 1;
            a = _a;
            b = _b;
        }
        return a;
    }
}

总结:

题目略微有些抽象,实际上就是将a 和 b 的二进制位相加,_a代表不考虑进位的二进制和,
_b代表单单是只有进位处值的和,当_b为0时意味着此时的_a已经是a + b的和
之所以要重复加的原因是当前进位加完可能还会有新的进位
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,460评论 25 708
  • 题目: 注意事项: 说明: 样例: 挑战: 代码: 详解:
    6默默Welsh阅读 432评论 0 0
  • 眼泪 蚌壳中凝聚的痛苦 使沙砾变成珍珠 我转身过去 你刚刚迈步离去 回忆和你都像蚌壳中凝聚的痛苦 也许曾经是幸福吧...
    鹿右右阅读 299评论 3 12
  • 其实 很多一开始没有想过的事情 突然发生了 人就会挺开心的 可是 贪婪和欲望应该是本性吧 欲壑难填 想要的就更多了...
    Kingsleyffy阅读 249评论 0 0
  • 比较简单,只做一个笔记,并于以后查询1、将微信支付第三方库拖到项目中 2、添加微信支付需要的依赖库 3、环境配置1...
    达达记阅读 361评论 0 0