原题网址: 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. python-模块安装方法
  2. 在文章没有缩略图的时候,如何去掉织梦官方的 DEDECMS无缩略图 图片
  3. ALV常用参数详细描述
  4. Random()方法的使用
  5. 【转+分析】JAVA: 为什么要使用&quot;抽象类&quot;? 使用&quot;抽象类&quot;有什么好处?
  6. 获取其他进程中ListBox和ComboBox的内容
  7. excel运行最多行数
  8. C++中explicit
  9. SAP ABAP exporting list to memory ...SUBMIT 程序传输屏幕参数
  10. MVC view视图获取Html.RenderAction方式带来的参数
  11. MyBatis进阶使用——动态SQL
  12. P2280 [HNOI2003]激光炸弹(二维前缀和)
  13. Linux运维面试题之--网页打开缓慢如何优化
  14. String类型的特殊之处
  15. iOS开发-命令模式
  16. 04 jsp,EL,JSTL
  17. Ubuntu 安装Sqldeveloper
  18. Atlas:ERROR 1105 (HY000): #07000Proxy Warning - IP Forbidden
  19. Complex Instance Placement
  20. 利用javascript:void(0)制作假的提交按钮替代button

热门文章

  1. 【SGU194】Reactor Cooling
  2. java中的访问修饰符详解
  3. QT install
  4. 帝国cms过滤采集内容
  5. Java中的线程Thread方法之---join()
  6. Android中的Serialable和Parcelable的区别
  7. PyQt5显示日期选择框,获取日期保存文件
  8. NX二次开发-UFUN更改视图比例大小UF_DRAW_set_view_scale
  9. NX二次开发-删除经典工具栏UF_UI_remove_toolbar
  10. NX二次开发-关闭信息窗口UF_UI_close_listing_window