确定进位时如何应用异或?

How is XOR applied when determining carry?

我正在开发 gameboy 模拟器。我需要实现的 CPU 操作之一是将字节 n 添加到堆栈指针 sp(操作码 E8)。如果第 7 位有进位,则需要设置进位标志。我已经查看了此操作的两个实现,它们都遵循相同的进位检测逻辑。其代码大致如下:

int result = (sp + n) & 0xFFFF
boolean carry = ((sp ^ n ^ result) & 0x100) != 0

我已经通过几个例子研究了这个逻辑,它确实有效,但我只是不明白它是如何工作的。我明白 xor 是如何工作的,但它在这里的应用背后的逻辑是什么?谢谢。

加法可以写成:

a + b = a ^ b ^ (c << 1)

其中 c 是每个位的进位(c << 1 是进位)。这也可以用作 implement addition.

的一种方式

因此,如果 a ^ b 部分再次从总和中进行异或运算,我们将剩下 c << 1。其中的第 8 位是第 7 位的进位。