You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用位运算实现两数相加?GeeksForGeeks编程练习题求解

不用算术运算符实现两整数相加的C#方案

嘿,这个问题我之前琢磨过,本质上是用位运算来模拟二进制加法,完全绕开常规的算术运算符。先把完整可运行的C#代码贴出来,再一步步拆解思路:

public static int Add(int x, int y) {
    // 循环直到没有进位需要处理
    while (y != 0) {
        // 提取两个数中同时为1的位(这些位会产生进位)
        int carry = x & y;
        // 计算无进位的和:两个位不同时为1的情况直接相加的结果
        x = x ^ y;
        // 进位左移一位,把进位放到正确的高位位置,下一轮循环处理
        y = carry << 1;
    }
    // 当y为0时,没有进位了,x就是最终的和
    return x;
}

为啥位运算能实现加法?

咱们回忆下二进制加法的规则:

  • 如果两个二进制位是0+00+11+0,结果就是这两个位的异或(^),这部分是「无进位的和」
  • 只有当两个位都是1+1时,会产生进位1,这个进位可以用**按位与(&)**提取出来,然后左移一位(<<1),因为进位要加到更高一位上

代码逐行解释

  • while (y != 0):y在这里代表当前需要处理的进位,只要还有进位没加完,就继续循环。当y变成0,说明所有进位都处理完毕,x就是最终的和。
  • int carry = x & y;:按位与操作会保留两个数中同时为1的位,这些位就是产生进位的地方。比如x=3(二进制011),y=5(101),x&y得到001,也就是十进制的1,这就是当前的进位值。
  • x = x ^ y;:异或操作得到两个数的无进位和。还是刚才的例子,011 ^ 101 = 110(十进制6),这就是不考虑进位时的相加结果。
  • y = carry << 1;:把进位左移一位,相当于把进位挪到更高一位的位置。刚才的carry是001,左移一位变成010(十进制2),下一轮循环就会把这个进位和之前的无进位和(6)继续相加。

举个实际例子验证

比如计算Add(3,5)

  1. 初始:x=3(011),y=5(101)
  2. 第一轮循环:carry=1(001),x=6(110),y=2(010)
  3. 第二轮循环:carry=2(010),x=4(100),y=4(100)
  4. 第三轮循环:carry=4(100),x=0(000),y=8(1000)
  5. 第四轮循环:carry=0,x=8(1000),y=0 → 循环结束,返回8,正好是3+5的结果。

内容的提问来源于stack exchange,提问作者user3175088

火山引擎 最新活动