位运算————两整数之和

Posted pacino12134

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了位运算————两整数之和相关的知识,希望对你有一定的参考价值。

技术图片

在位运算操作中,异或的一个重要特性是无进位加法

a = 5 = 0101
b = 4 = 0100

a ^ b 如下:

0 1 0 1
0 1 0 0
-------
0 0 0 1

得到了一个无进位加法结果,如果要得到 a + b 的最终值,我们还要找到进位的数,把这二者相加。在位运算中,我们可以使用与操作获得进位:

a = 5 = 0101
b = 4 = 0100

a & b 如下:

0 1 0 1
0 1 0 0
-------
0 1 0 0

由计算结果可见,0100 并不是我们想要的进位,1 + 1 所获得的进位应该要放置在它的更高位,即左侧位上,因此我们还要把 0100 左移一位,才是我们所要的进位结果。

那么问题就容易了,总结一下:

  • a + b 的问题拆分为 (a 和 b 的无进位结果) + (a 和 b 的进位结果)
  • 无进位加法使用异或运算计算得出
  • 进位结果使用与运算和移位运算计算得出
  • 循环此过程,直到进位为 0
 1 class Solution 
 2 public:
 3     int getSum(int a, int b) 
 4         //a为异或结果,无进位
 5         //b为与救过,进位的位置-1,所以要<<1
 6         //直到进位为0
 7         while(b)
 8             int tmp=a^b;
 9             b = ((unsigned int)a&b)<<1;//unsinged 防止整型溢出,变成无符号就可以防止有符号整型的溢出了
10             a = tmp;
11         
12         return a;
13     
14 ;

 

以上是关于位运算————两整数之和的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 371 两整数之和[位运算] HERODING的LeetCode之路

Leetcode——两整数之和

leetcode解题报告(两数之和,递归乘法)

LeetCode|371. 两整数之和

写一个方法,求两个整数之和,要求在函数体内不得使用+-*/四则运算符号。

不使用+或-运算符,计算两数之和