Как применяется XOR при определении переноса? - PullRequest
3 голосов
/ 25 мая 2020

Работаю над эмулятором gameboy. Одна из операций ЦП, которую мне нужно реализовать, - это добавление байта n к указателю стека sp (код операции E8). Флаг переноса должен быть установлен, если есть перенос из бита 7. Я рассмотрел две реализации этой операции, и обе они следуют одному и тому же логу обнаружения переноса c. Код для этого примерно следующий:

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

Я проработал этот logi c с несколькими примерами, и он действительно работает, но я просто не понимаю как оно работает. Я понимаю, как работает xor, но что за лог c здесь стоит его приложение? Спасибо.

1 Ответ

3 голосов
/ 25 мая 2020

Сложение можно записать как:

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

Где c - перенос для каждого бита (c << 1 - переносимый). Это также можно использовать как способ реализовать сложение .

Поэтому, если часть a ^ b снова исключают из суммы XOR, у нас остается c << 1. Бит 8 этого значения является переносом бита 7.

...