Lintcode--4(1)--A+B
题目:给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符。
说明:
a和b都是 32位 整数么?
是的
我可以使用位运算符么?
当然可以
样例:
如果 a=1 并且 b=2,返回3
显然你可以直接 return a + b,但是你是否可以挑战一下不这样做?
原理:
考虑一个普通的加法计算:5+17=22
在十进制加法中可以分为如下3步进行:
1. 忽略进位,只做对应各位数字相加,得到12(个位上5+7=12,忽略进位,结果2);
2. 记录进位,上一步计算中只有个位数字相加有进位1,进位值为10;
3. 按照第1步中的方法将进位值与第1步结果相加,得到最终结果22。
下面考虑二进制数的情况(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,典型的异或运算,相同为0不同为1。
x1= A^B
第2步:计算进位,只有1+1会向前产生进位1,相对于这一数位的进位值为10,而10=(1&1)<<1。
x2 =(A&B)<<1
第3步:相加,将第1步和第2步得到的结果相加,其实又是在重复这2步,直到不再产生进位为止。
result = x1+x2
实例:
101+011=1000 //正常加法
位运算加法:
(1) 101 ^ 011 = 110
(101 & 011)<<1 = 010
(2) 110 ^ 010 = 100
(110 & 010)<<1 = 100
(3) 100 ^ 100 = 000
(100 & 100)<<1 = 1000
此时进行相加操作就没有进位了,即000 ^ 1000=1000即是最后结果
class Solution {
public:
int aplusb(int a, int b) {// write your code hereif(a==0) return b;if(b==0) return a; int x1, x2;x1=a^b;x2=(a&b)<<1;aplusb(x1,x2);
}
};
int aplusb(int a, int b) { while(b!=0) { int x1=a^b; int x2=(a&b)<<1; a = x1;b = x2;
}
return a;
}
参考:点击打开链接
参考:点击打开链接
参考:点击打开链接
Lintcode--4(1)--A+B相关推荐
- LintCode 249. 统计前面比自己小的数的个数
给定一个整数数组(下标由 0 到 n-1, n 表示数组的规模,取值范围由 0 到10000).对于数组中的每个 ai 元素,请计算 ai 前的数中比它小的元素的数量. 注意事项 We suggest ...
- LintCode: Max Tree
题目 Given an integer array with no duplicates. A max tree building on this array is defined as follow ...
- 【LintCode: 3. 统计数字】算法题解析
这是一道来自LintCode的算法题目,本文用C++来解答这道题,链接为: https://www.lintcode.com/problem/digit-counts/description 题目描述 ...
- LintCode 1.A+B的问题
LintCode 1.A+B的问题 描述 给出两个整数 a 和 b , 求他们的和. 答案 public class Solution {/*** @param a: An integer* @par ...
- 关于爬楼梯的lintcode代码
讲真的,这个我只会用递归去做,但是lintcode上面超时,所以只有在网上找了个动态规划的,虽然这个程序懂了,但是我觉得还是挺不容易的真正弄懂的话-- class Solution { public: ...
- lintcode: k Sum 解题报告
K SUM My Submissions http://www.lintcode.com/en/problem/k-sum/ 题目来自九章算法 13% Accepted Given n distinc ...
- LintCode Longest Increasing Continuous Subsequence
原题链接在这里:http://www.lintcode.com/en/problem/longest-increasing-continuous-subsequence/ 题目: Give an in ...
- lintcode 滑动窗口的最大值(双端队列)
题目链接:http://www.lintcode.com/zh-cn/problem/sliding-window-maximum/# 滑动窗口的最大值 给出一个可能包含重复的整数数组,和一个大小为 ...
- leetcode 293.Flip Game(lintcode 914) 、294.Flip Game II(lintcode 913)
914. Flip Game https://www.cnblogs.com/grandyang/p/5224896.html 从前到后遍历,遇到连续两个'+',就将两个加号变成'-'组成新的字符串加 ...
- LintCode 402: Continuous Subarray Sum
LintCode 402: Continuous Subarray Sum 题目描述 给定一个整数数组,请找出一个连续子数组,使得该子数组的和最大.输出答案时,请分别返回第一个数字和最后一个数字的下标 ...
最新文章
- pandas使用groupby函数、agg函数获取每个分组聚合对应的标准差(std)实战:计算分组聚合单数据列的标准差(std)、计算分组聚合多数据列的标准差(std)
- 怎样只接受固定长度数组为参数 数组形参
- Tomcat如何添加管理员
- STM32的调试方式、更新程序、仿真以及补救措施
- mysql 查看用户权限_在Navicat Premium中管理MySQL用户 - 第4部分:权限管理器工具
- java web 获取根目录_javaweb中获取服务器端跟目录方法总结
- 解决error 1045: Access denied for user: 'root@localhost' (Using password: YES)
- AT2567-[ARC074C]RGB Sequence【dp】
- Zabbix3.2安装
- Ubuntu Server 16.04 安装并用两块硬盘做RAID1
- Ubuntu20.04 添加打印机
- Android DocumentFile基本使用
- PHP动态网站开发期末试卷,《PHP动态网站开发实例教程》课程考核方案
- 桌面最前 desk_使用T3Desk在3D桌面环境中管理应用程序
- openlayers 利用克里金插值法渲染等值面
- 注意力机制——Self-Attention Networks(SANet)
- 如何解决计算机黑屏问题,电脑黑屏怎么处理(三个键教您解决黑屏问题)
- QT QChartView 鼠标随动 十字线 缩放 平移 拖动
- shell-sed和awk
- java 求水仙花数
热门文章
- matlab resample,resample matlab实现
- linux 查看主板sn_如何在 Linux 上查找硬件规格
- pat 乙级 1014 福尔摩斯的约会 (C++)
- 光纤收发器让网络布线变的更方便
- Memobus总线光端机产品功能介绍
- 【渝粤教育】国家开放大学2018年秋季 0717-22T社会保障基础 参考试题
- 【渝粤教育】国家开放大学2018年春季 0283-21T广告创意与表现(二) 参考试题
- 【渝粤题库】国家开放大学2021春1283社会保障学(本)题目
- oracle内连接使用,Oracle中的联合查询-自然连接/外连接/内连接
- smtplib 抄送邮件_用Python收发电子邮件