Пусть 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);