эксклюзивный xor / или оператор? - PullRequest
0 голосов
/ 02 декабря 2018

Мы еще не сделали этого в лекции, и я пытаюсь выяснить, как заменить мой (если / еще) на один эксклюзивный ордер OR.Может кто-нибудь объяснить мне, как это должно быть сделано?

(полный код показывает «LED-дисплей», написанный в #)

void toggle_pixel_v2(unsigned int pixel_number, void *adr) {
char *pc = (char *)adr;
int ioff = (pixel_number-1) / 8;
int ibit = (pixel_number-1) % 8;
if ( pc[ioff] & (1<<ibit) ) pc[ioff] &= ~(1<<ibit);
else pc[ioff] |= (1<<ibit);

}

1 Ответ

0 голосов
/ 02 декабря 2018

Пусть a будет битом в позиции b в A.
A &= ~(1<<b) сбрасывает a.A |= (1<<b) комплектов a.Обе операции оставляют остаток A без изменений, потому что x & 1 = x и x | 0 = x.

С A = pc[ioff] и b = ibit, ваш код очищает a, если он установлен, и устанавливает его, если оннет.Это результат исключения или: поскольку в (1<<b) установлен только бит в позиции b, результат A ^ (1<<b) равен A с переключением a (поскольку x ^ 1 = ~x и x ^ 0 = x).

Итак, следующие два кода эквивалентны:

if (A & (1<<b))
    A &= ~(1<<b);
else
    A |= (1<<b);

A ^= (1<<b);
...