题目:给出两个整数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相关推荐

  1. LintCode 249. 统计前面比自己小的数的个数

    给定一个整数数组(下标由 0 到 n-1, n 表示数组的规模,取值范围由 0 到10000).对于数组中的每个 ai 元素,请计算 ai 前的数中比它小的元素的数量. 注意事项 We suggest ...

  2. LintCode: Max Tree

    题目 Given an integer array with no duplicates. A max tree building on this array is defined as follow ...

  3. 【LintCode: 3. 统计数字】算法题解析

    这是一道来自LintCode的算法题目,本文用C++来解答这道题,链接为: https://www.lintcode.com/problem/digit-counts/description 题目描述 ...

  4. LintCode 1.A+B的问题

    LintCode 1.A+B的问题 描述 给出两个整数 a 和 b , 求他们的和. 答案 public class Solution {/*** @param a: An integer* @par ...

  5. 关于爬楼梯的lintcode代码

    讲真的,这个我只会用递归去做,但是lintcode上面超时,所以只有在网上找了个动态规划的,虽然这个程序懂了,但是我觉得还是挺不容易的真正弄懂的话-- class Solution { public: ...

  6. lintcode: k Sum 解题报告

    K SUM My Submissions http://www.lintcode.com/en/problem/k-sum/ 题目来自九章算法 13% Accepted Given n distinc ...

  7. LintCode Longest Increasing Continuous Subsequence

    原题链接在这里:http://www.lintcode.com/en/problem/longest-increasing-continuous-subsequence/ 题目: Give an in ...

  8. lintcode 滑动窗口的最大值(双端队列)

    题目链接:http://www.lintcode.com/zh-cn/problem/sliding-window-maximum/# 滑动窗口的最大值 给出一个可能包含重复的整数数组,和一个大小为  ...

  9. leetcode 293.Flip Game(lintcode 914) 、294.Flip Game II(lintcode 913)

    914. Flip Game https://www.cnblogs.com/grandyang/p/5224896.html 从前到后遍历,遇到连续两个'+',就将两个加号变成'-'组成新的字符串加 ...

  10. LintCode 402: Continuous Subarray Sum

    LintCode 402: Continuous Subarray Sum 题目描述 给定一个整数数组,请找出一个连续子数组,使得该子数组的和最大.输出答案时,请分别返回第一个数字和最后一个数字的下标 ...

最新文章

  1. pandas使用groupby函数、agg函数获取每个分组聚合对应的标准差(std)实战:计算分组聚合单数据列的标准差(std)、计算分组聚合多数据列的标准差(std)
  2. 怎样只接受固定长度数组为参数 数组形参
  3. Tomcat如何添加管理员
  4. STM32的调试方式、更新程序、仿真以及补救措施
  5. mysql 查看用户权限_在Navicat Premium中管理MySQL用户 - 第4部分:权限管理器工具
  6. java web 获取根目录_javaweb中获取服务器端跟目录方法总结
  7. 解决error 1045: Access denied for user: 'root@localhost' (Using password: YES)
  8. AT2567-[ARC074C]RGB Sequence【dp】
  9. Zabbix3.2安装
  10. Ubuntu Server 16.04 安装并用两块硬盘做RAID1
  11. Ubuntu20.04 添加打印机
  12. Android DocumentFile基本使用
  13. PHP动态网站开发期末试卷,《PHP动态网站开发实例教程》课程考核方案
  14. 桌面最前 desk_使用T3Desk在3D桌面环境中管理应用程序
  15. openlayers 利用克里金插值法渲染等值面
  16. 注意力机制——Self-Attention Networks(SANet)
  17. 如何解决计算机黑屏问题,电脑黑屏怎么处理(三个键教您解决黑屏问题)
  18. QT QChartView 鼠标随动 十字线 缩放 平移 拖动
  19. shell-sed和awk
  20. java 求水仙花数

热门文章

  1. matlab resample,resample matlab实现
  2. linux 查看主板sn_如何在 Linux 上查找硬件规格
  3. pat 乙级 1014 福尔摩斯的约会 (C++)
  4. 光纤收发器让网络布线变的更方便
  5. Memobus总线光端机产品功能介绍
  6. 【渝粤教育】国家开放大学2018年秋季 0717-22T社会保障基础 参考试题
  7. 【渝粤教育】国家开放大学2018年春季 0283-21T广告创意与表现(二) 参考试题
  8. 【渝粤题库】国家开放大学2021春1283社会保障学(本)题目
  9. oracle内连接使用,Oracle中的联合查询-自然连接/外连接/内连接
  10. smtplib 抄送邮件_用Python收发电子邮件