确定进位时如何应用异或?
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 位的进位。
我正在开发 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 位的进位。