当前位置:   article > 正文

【Leetcode每日一题】 位运算 - 两整数之和(难度⭐)(37)

【Leetcode每日一题】 位运算 - 两整数之和(难度⭐)(37)

1. 题目解析

题目链接:371. 两整数之和

这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。

2.算法原理

算法的核心思路其实可以类比为我们小时候学习的加法运算。只不过这次,我们不是在纸上用铅笔算,而是在计算机里用二进制数字来进行。这个算法巧妙地利用了异或(^)和按位与(&)这两种位运算来实现二进制数的加法。

  1. 异或运算:模拟不进位的加法

异或运算在二进制的世界里,就像是两个小朋友在做加法,但他们只关心当前位的和,不考虑进位。比如,1 + 1 在十进制里是2,但在异或运算里,1 ^ 1 等于 0,就像两个小朋友说:“我们这一位加起来是0,不用进位哦!”同样地,0 ^ 0、0 ^ 1、1 ^ 0 都分别等于 0、1、1,就像是他们正确地计算出了每一位的和。

  1. 按位与运算:找出需要进位的位

但是,小朋友们也知道,有时候加法是需要进位的。这时候,按位与运算就像是另一个小朋友,专门负责找出哪些位需要进位。比如,1 & 1 在二进制里是1,这意味着这一位两个小朋友加起来满2了,需要向高位进1。而0 & 0、0 & 1、1 & 0 都等于0,表示这些位不需要进位。

  1. 循环进行,直到没有进位

有了这两个小朋友(异或和按位与),我们就可以开始计算加法了。首先,我们用异或运算得到当前不考虑进位的和。然后,我们用按位与运算找出哪些位需要进位。如果发现有进位,我们就把这些进位加到下一轮的运算中。这样一轮一轮地进行,直到所有的进位都处理完,也就是按位与的结果变成0,我们就得到了最终的和。

这个算法虽然看起来有些复杂,但其实非常高效。因为它直接在二进制位上进行操作,避免了十进制加法中可能需要的多次进位和借位。在计算机内部,这种位运算的速度是非常快的,所以这种算法在处理大量数据时特别有用。

3.代码编写

  1. class Solution
  2. {
  3. public:
  4. int getSum(int a, int b)
  5. {
  6. while(b != 0)
  7. {
  8. size_t x = a ^ b;
  9. size_t y = (size_t)(a & b) << 1;
  10. a = x;
  11. b = y;
  12. }
  13. return a;
  14. }
  15. };
The Last

嗯,就是这样啦,文章到这里就结束啦,真心感谢你花时间来读。

觉得有点收获的话,不妨给我点个吧!

如果发现文章有啥漏洞或错误的地方,欢迎私信我或者在评论里提醒一声~ 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/257092
推荐阅读
相关标签
  

闽ICP备14008679号