Таким образом, у нас есть старая маска и новая маска, и ни один из нулей старой маски не должен быть установлен в новой маске.
Решение простое: инвертировать старую маску, превратив все нули в единицы, а единицы в нули. И результат с новой маской - если результат ненулевой, произошла нежелательная вещь.
Демонстрируя это на минимальном примере. У нас есть
old = 0011
new = 1001
Есть два бита, которые изменились, два бита не изменились; одно изменение нежелательно. Мы инвертируем old
с ~
и и с new
:
~old = 1100
new = 1001
& ----------
1000
результат не равен нулю, поэтому мы знаем, что ноль был заменен на один.
Код см. Ответ Какауэте