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


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

    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 };
  • 相关阅读:
    Object-C,NSSet,不可变集合
    NYIST 860 又见01背包
    NYIST 1070 诡异的电梯【Ⅰ】
    HDU 1542 Atlantis
    HDU 4756 Install Air Conditioning
    CodeForces 362E Petya and Pipes
    HDU 4751 Divide Groups
    HDU 3081 Marriage Match II
    UVA 11404 Palindromic Subsequence
    UVALIVE 4256 Salesmen
  • 原文地址:https://www.cnblogs.com/pacino12134/p/11052038.html
Copyright © 2020-2023  润新知