1 A+B问题
2024-10-07 20:21:59
原题网址: 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. 忽略进位,对应各位数字相加,得到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步,直到不再产生进位为止。
第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;
}
};
最新文章
- python-模块安装方法
- 在文章没有缩略图的时候,如何去掉织梦官方的 DEDECMS无缩略图 图片
- ALV常用参数详细描述
- Random()方法的使用
- 【转+分析】JAVA: 为什么要使用";抽象类";? 使用";抽象类";有什么好处?
- 获取其他进程中ListBox和ComboBox的内容
- excel运行最多行数
- C++中explicit
- SAP ABAP exporting list to memory ...SUBMIT 程序传输屏幕参数
- MVC view视图获取Html.RenderAction方式带来的参数
- MyBatis进阶使用——动态SQL
- P2280 [HNOI2003]激光炸弹(二维前缀和)
- Linux运维面试题之--网页打开缓慢如何优化
- String类型的特殊之处
- iOS开发-命令模式
- 04 jsp,EL,JSTL
- Ubuntu 安装Sqldeveloper
- Atlas:ERROR 1105 (HY000): #07000Proxy Warning - IP Forbidden
- Complex Instance Placement
- 利用javascript:void(0)制作假的提交按钮替代button
热门文章
- 【SGU194】Reactor Cooling
- java中的访问修饰符详解
- QT install
- 帝国cms过滤采集内容
- Java中的线程Thread方法之---join()
- Android中的Serialable和Parcelable的区别
- PyQt5显示日期选择框,获取日期保存文件
- NX二次开发-UFUN更改视图比例大小UF_DRAW_set_view_scale
- NX二次开发-删除经典工具栏UF_UI_remove_toolbar
- NX二次开发-关闭信息窗口UF_UI_close_listing_window