【算法】位运算算法——两整数之和

简介: 【算法】位运算算法——两整数之和

题解:两整数之和(位运算算法)

1.题目

题目链接:LINK

2.位运算算法

这个题目难点就在于不能用+、-

那什么能够代替加号呢?

既然数的层面不能用+号,那二进制的角度去用+号即可。

恰好,就有两个这种运算符恰好满足我们的需求。

按位异或,对不存在进位的数字进行相加。

按位与,对需要进位的数字取1

当我们对a^b进行异或的时候,

我们发现:

如果1和0不同的位数异或是我们想要的结果,但两个二进制都是1的时候进行异或就不对(红色代表不满足我们预期,绿色代表满足我们预期)

结论:错误的都是需要进位的二进制

那如何进行进位呢?

怎么确定哪几个二进制位需要进位? ——按位与

按位与恰好可以解决我们这个问题,两个1的二进制位肯定是需要进位的啊(黄色代表需要进位的地方)。

那如何把这个黄色的位进到a^b上去呢?

我们可以把a&b向左移动一位,表示向其更高位进行进位。

然后我们再对a^b 和 (a&b)>>1再进行异或运算,看看能不能进上一位。

我们发现好像有个1进位成功,还一个没能成功,但是没关系,继续以此循环即可。

总过程如下:

3.参考代码

//一般版本
class Solution {
public:
    int getSum(int a, int b) 
    {
        int Carry = 1;
        while(Carry)
        {
           int add = a ^ b;
           Carry = (a & b) << 1;
           a = add;
           b = Carry;
        }
        return a;        
    }
};
//语法优化
class Solution {
public:
    int getSum(int a, int b) 
    {
        do
        {
           a = a ^ b;
           b = (((a^b) & b) << 1);
        }while(b);
        return a;        
    }
};

4.总结

我们本道题首先题目规定不能用+号,所以我们想到直接去二进制层面进行操作,用^代替无进位相加,用&代替进位,两者结合即可模拟出二进制层面加法的操作。


EOF

相关文章
|
7月前
|
算法
算法思想总结:位运算
算法思想总结:位运算
|
7月前
|
机器学习/深度学习 存储 算法
【算法基础】常数操作 时间复杂度 选择排序 冒泡排序 插入排序 位运算
【算法基础】常数操作 时间复杂度 选择排序 冒泡排序 插入排序 位运算
|
算法
基础算法:位运算
基础算法:位运算
55 0
|
4月前
|
算法
【算法】位运算算法——消失的两个数字(困难)
【算法】位运算算法——消失的两个数字(困难)
|
4月前
|
算法
【算法】位运算算法——只出现一次的数字Ⅱ
【算法】位运算算法——只出现一次的数字Ⅱ
|
4月前
|
算法
【算法】位运算算法——判断字符是否唯一
【算法】位运算算法——判断字符是否唯一
|
4月前
|
算法
【算法】位运算算法——丢失的数字
【算法】位运算算法——丢失的数字
|
4月前
|
算法
算法】位运算——常见位运算基础操作总结
算法】位运算——常见位运算基础操作总结
算法】位运算——常见位运算基础操作总结
|
6月前
|
存储 自然语言处理 算法
位运算入门及简单算法题的应用
位运算入门及简单算法题的应用
48 1
|
6月前
|
算法 Java
Java数据结构与算法:位运算之位移操作
Java数据结构与算法:位运算之位移操作