Как проверить, изменились ли нули на единицы (но не наоборот) - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть двоичная маска, которую я обновляю.Это нормально, что 1 в моей старой маске становится 0, но наоборот не разрешено.Как можно с помощью некоторых бинарных операций утверждать, что ни один из 0 в маске не превратился в 1?

Ответы [ 2 ]

5 голосов
/ 30 апреля 2019
if (~old & new)

Если вы также хотите узнать, какие биты изменились с 0 на 1, просто прочитайте каждый бит в bits = ~old & new;.Если вы просто хотите узнать, стали ли 0 равными 1, то подойдет первая строка кода.

1 голос
/ 30 апреля 2019

Таким образом, у нас есть старая маска и новая маска, и ни один из нулей старой маски не должен быть установлен в новой маске.

Решение простое: инвертировать старую маску, превратив все нули в единицы, а единицы в нули. И результат с новой маской - если результат ненулевой, произошла нежелательная вещь.

Демонстрируя это на минимальном примере. У нас есть

old = 0011
new = 1001

Есть два бита, которые изменились, два бита не изменились; одно изменение нежелательно. Мы инвертируем old с ~ и и с new:

 ~old = 1100
  new = 1001
& ----------
        1000

результат не равен нулю, поэтому мы знаем, что ноль был заменен на один.

Код см. Ответ Какауэте

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...