zoukankan      html  css  js  c++  java
  • 位运算————两整数之和

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

    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 };
  • 相关阅读:
    省选测试13
    省选测试12
    省选测试11
    省选测试9
    省选测试10
    省选测试8
    省选测试7
    省选测试6
    倍增 LCA && ST表
    博客园markdown
  • 原文地址:https://www.cnblogs.com/pacino12134/p/11052038.html
Copyright © 2011-2022 走看看