2016.9.11 Leetcode 371. Sum of Two Integers

Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -.

Example:
Given a = 1 and b = 2, return 3.

解法一
思路:这里用到了一个半加法的思想, 即两位单独的位相加其结果可以用异或得到, 进位可以用与得到. 然后对于两个数字来说同样可以延伸这个思想.

举个例子: 11+5, 其二进制形式为11: 1011, 5: 0101

  1. 那么两个位置都为1的地方就需要进位, 所以进位值就为0001. 原位置两个数相加的结果为那个位置值的异或即1110, 即两个位置值如果不一样就为1, 一样的话要么两个位置原来值都为0结果也为0, 要么进位, 那么结果依然是0.

  2. 接下来就要把进位位和下一位相加, 所以进位值左移一位,即0001变为0010, 重复上面操作可得新的进位值为0010, 原位置异或(即相加)结果为1100,而1110和0010相与之后,变为0010,左移一位,是0100,依次继续。

  3. 继续重复上面操作直到进位为0, 可得到最终结果10000, 即16

class Solution {
public:
    int getSum(int a, int b) {
        int r = b;
        for(;a;b=r){
            r^=a;//把每次a和b的异或赋值给r,然后再赋值给 b,类似于1110,1100
            a=(a&b)<<1;//每次 a与 b的相与左移一位,赋值给 a,类似于0010,0100
        }
        return r;
    }
};

这种思想也可以有另一种写法。

int getSum(int a, int b){
      while(a!=0){
            int temp=(a&b)<<1;
            b^=a;
            a=temp;
      }
      return b;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 题目描述:Calculate the sum of two integers a and b, but you a...
    Fluxay阅读 3,150评论 0 0
  • 网站乱码问题我们会经常碰到,大多见于非英文的中文字符或其他字符乱码,而且,这类问题常常是因为编码方式问题,主要原因...
    波段顶底阅读 8,319评论 1 9
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,356评论 0 33
  • 1 关键字 1.1 关键字的概述 Java的关键字对java的编译器有特殊的意义,他们用来表示一种数据类型,或...
    哈哈哎呦喂阅读 3,940评论 0 0
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 32,497评论 18 399

友情链接更多精彩内容