我正在处理来自GeeksForGeeks的以下练习问题:
编写一个名为Add()的函数,返回两个整数的和。该函数不应使用任何算术运算符(+、++、–、-等)。
以下是C#中给出的解决方案:
public static int Add(int x, int y)
{
// Iterate till there is no carry
while (y != 0)
{
// carry now contains common set bits of x and y
int carry = x & y;
// Sum of bits of x and y where at least one of the bits is not set
x = x ^ y;
// Carry is shifted by one so that adding it to x gives the required sum
y = carry << 1;
}
return x;
}
看到这个解决方案,我理解了如何进行操作;我可以跟随调试器并在值变化之前预测它们的改变。但是经过多次演练后,我仍然不理解为什么会发生这种情况。如果这在面试中出现,我将只能依靠记忆来解决问题,而不是真正理解算法的工作原理。
有人能解释一下为什么我们在某些点上使用特定的运算符以及这些总数应该表示什么吗? 我知道代码中已经有注释,但显然我还是缺少了一些东西...