原题网址: http://www.lintcode.com/zh-cn/problem/a-b-problem/#

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

注意事项

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

您在真实的面试中是否遇到过这个题?

Yes
说明

a和b都是 32位 整数么?

  • 是的

我可以使用位运算符么?

  • 当然可以
样例

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

挑战

显然你可以直接 return a + b,但是你是否可以挑战一下不这样做?

标签

 
方法:使用位运算。哇的一声哭出来,没用过位运算的我完全懵逼,还是基础太差。
 
 
 
具体思路上面的链接已经说的很清楚了,加法的步骤:
1、忽略进位对位数字相加
2、记录进位
3、进位值与第一步结果相加。
 
考虑二进制数的情况(5=101,17=10001):
仍然分3步:
    1. 忽略进位,对应各位数字相加,得到10100;
    2. 记录进位,本例中只有最后一位相加时产生进位1,进位值为10(二进制);
    3. 按照第1步中的方法将进位值与第1步结果相加,得到最终结果10110,正好是十进制数22的二进制表示。
 
接下来把上述二进制加法3步计算法用位运算替换:
    第1步(忽略进位):0+0=0,0+1=1,1+0=0,1+1=0,典型的异或运算。
    第2步:很明显,只有1+1会向前产生进位1,相对于这一数位的进位值为10,而10=(1&1)<<1。
    第3步:将第1步和第2步得到的结果相加,其实又是在重复这2步,直到不再产生进位为止。
   (注意相加相当于调用函数自身,只不过参数变成了进位与忽略进位的和)——递归
    两种情况:若进位为0,返回第一步相加结果;若进位不为0,进位与第一步的和相加其实是重复上面1、 2、两步,直到进位为0。——循环

 
PS:再简单说下第2步的理解,两个二进制数a和b相加,只有都是1的数位会产生进位,‘&’——与运算可以找到会产生进位的数位,再将其整体左移1位就可以得到两数相加的进位值了。
 
递归: 
 int aplusb2(int a, int b)
{
if (a==)
{
return b;
}
if (b==)
{
return a;
}
int x=a^b;
int y=(a&b)<<;
return aplusb2(x,y);
}
 循环:
 class Solution {
public:
/**
* @param a: An integer
* @param b: An integer
* @return: The sum of a and b
*/
int aplusb(int a, int b) {
// write your code here
while(b!=)
{
int x=a^b;
int y=(a&b)<<;
a=x;
b=y;
}
return a;
}
};
 

随机推荐

  1. mysql命令行执行时不输出列名(字段名),直接显示字段对应的数值

    执行命令时加个-N参数就可以了 -N, –skip-column-names 比如说:mysql -uroot -p1234546 -N -e “select * from user;”

  2. ACM-ICPC 训练平台 & 比赛 分析

    the file can download in https://pan.baidu.com/s/1HwoLFHGAG-boQbIn9xIhxA occ5 the article is also pu ...

  3. leetcode-两个数组的交集

    C++解题方法: class Solution { public: vector<int> intersection(vector<int>& nums1, vecto ...

  4. leetcode-159周赛-5233-规划兼职工作*

    方法: class Solution: def jobScheduling(self, startTime: List[int], endTime: List[int], profit: List[i ...

  5. javascript--判断语句

    1.if...else.. if(m===1){ console.log('1') }else{ console.log('X') } 一般if 里面采用类型全等的运算符. 2.switch var ...

  6. 38 ubuntu/windows双系统安装

    0 引言 (1)针对bios 和 uefi引导,安装方式略有不同. (2)针对nvidia显卡,在安装时需要特殊设置. 1 EasyBCD安装方式介绍-适用于bios引导方式 参考百度经验贴安装即可, ...

  7. 图片转换为base64

    明天中秋了,先祝大家中秋快乐!哈哈,最近见有人在群里问怎么把图片转换成base64格式,之前刚好写过就把代码贴出来. 主要用到canvas中的toDataURL方法 <!DOCTYPE html ...

  8. cdq分治·三维偏序问题

    转载自FlashHu大佬的博客CDQ分治总结(CDQ,树状数组,归并排序),在讲述部分有部分删改,用了自己的代码 CDQ分治的思想 CDQ分治是基于时间的离线分治算法.这一类分治有一个重要的思想——用 ...

  9. 创建用户的方法 3种mysql创建方法

    mysql创建用户的方法分成三种:INSERT USER表的方法.CREATE USER的方法.GRANT的方法.   一.账号名称的构成方式   账号的组成方式:用户名+主机(所以可以出现重复的用户 ...

  10. JsJquery小技巧

    JS对URL编码 :encodeURI() .Net对URL解码:HttpUtility.UrlDecode() 格式化输出百分数 function formatePercent(data){     ...