A+B问题

lintcode算法题 1. A + B 问题

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

说明 a和b都是 32位 整数么? 是的。我可以使用位运算符么? 当然可以

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

挑战 显然你可以直接 return a + b,但是你是否可以挑战一下不这样做?(不使用++等算数运算符)

代码:Talk is cheap. Show me the code.

int add(int a,int b){

    if(b==0){       

        return a;   

    }else{       

        return add(a^b,(a&b)<<1);   

    }

}

分析:

这道题用到的是位运算,位运算符中与加有关的首先想到的是异或运算。

1. 异或:相异为1,相同为0。

特殊情况下,异或运算的结果与+相同。比如5和2

5+2 = 0101 + 0010 = 0111 = 7

5^2 = 0101 ^ 0010 = 0111 = 7

结果都是7。在5和2的二进制加法中刚好不存在进位,如果存在进位那又是什么情况呢。比如6和2

6+2 = 0110 + 0010 =1000 = 8

6^2 = 0110 ^ 0010 = 0010 = 2

可见,当需要进位的时候结果就不相同了。所以不需要进位的我们可以用异或,需要进位的我们继续分析。

2. 左移:把所有二进制位左移n位,右边补0(这里不考虑有符号无符号和溢出的问题)。

对于二进制进位,首选左移。左移一位相当于给所有是1的位进位一次,比如

3 << 1 = 0011 << 1 = 0110 = 6

回归我们的问题,进位有了,剩下的我们要找出哪些位需要进位,也就是那些位在两个加数里都是1,这里就又需要一个新的位运算 与

3. 与:都是1为1,否则为0。

在我们的问题中,与运算后为1的位需要进位。即a&b的结果需要进位,进位用左移,即(a&b)<<1 可以计算出进位后的结果。

整个计算过程是这样的

1.  先异或(a^b): 筛选不能进位的二进制位 标记为1 计算出中间数b1。

2. 然后与(a&b): 筛选需要进位的二进制位 标记为1 ;再左移((a&b)<<1) 理解为 进位 对需要进位的二进制位进位 计算出中间数a1。

3.注意:此时的 a1+b1 == a+b。把a1看作a,把b1看作b,继续1,2步骤,直到b==0,也就是没有需要进位的二进制位。此时的a就是原来的a+b的结果。

例子:

a = 15 , b = 22 求 a+b

-------------------------------

第一轮运算

     a = 15    0000 1111   a原值

      b = 22    0001 0110  b原值

    a^b = 25    0001 1001  筛选出的不需要进位的位,计作a1

    a&b =  6    0000 0110 筛选出的需要进位的位

 a&b<<1 = 12    0000 1100 给需要进位的位 进位,结果计作b1

 -------------------------------

第二轮运算

      a = 25    0001 1001  第一轮计算出的a1

      b = 12    0000 1100 第一轮计算出的b1

    a^b = 21    0001 0101

    a&b =  8    0000 1000

 a&b<<1 = 16    0001 0000

 -------------------------------

第三轮运算

      a = 21    0001 0101

      b = 16    0001 0000

    a^b =  5    0000 0101

    a&b = 16    0001 0000

 a&b<<1 = 32    0010 0000

 -------------------------------

第四轮运算

      a =  5    0000 0101

      b = 32    0010 0000

    a^b = 37    0010 0101

    a&b =  0    0000 0000

 a&b<<1 =  0    0000 0000

 -------------------------------

第五轮运算,此时b==0,a即运算结果。

      a = 37    0010 0101

      b =  0    0000 0000

 -------------------------------

结果

    a+b = 37

 -------------------------------


最后

初学者 参考了网上很多资料搞明白的,感谢各位乐于分享的大神,希望可以给以后同学一点帮助。如有错误,欢迎指正。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容

  • 我是小小强,这是我的第5篇原创文章,阅读需要大约10分钟。 题目 LintCode:A+B问题 描述 给出两个整数...
    我叫小小强阅读 277评论 0 3
  • 网站乱码问题我们会经常碰到,大多见于非英文的中文字符或其他字符乱码,而且,这类问题常常是因为编码方式问题,主要原因...
    波段顶底阅读 2,822评论 1 9
  • 版权声明:本文参考网络文章。 难度:普通 要求: 给出两个整数a和b, 求他们的和, 但不能使用 +等数学运算符。...
    柒黍阅读 1,511评论 0 2
  • 看了波哥的计划,颇有震撼,自己完成不了那么多,我来个精简版的。 家庭: 每周给爸爸、妈妈、姐姐、姐夫、申萌、申逗各...
    Inker阅读 247评论 0 4
  • 前同事W最近又离职了,理由是现在的岗位太没有前景了,上司总压制着自己,什么想法都实现不了。行业竞争残酷,公司规矩也...
    零零鱼阅读 229评论 1 1