Как проверить, содержит ли шестнадцатеричное число другое шестнадцатеричное число - PullRequest
0 голосов
/ 19 апреля 2020

Я пытался сделать sh что-то похожее на калькулятор разрешений разногласий (как этот: https://discordapi.com/permissions.html). Я использовал побитовые операторы combine_hex_number = hex_number | hex_number2 для объединения шестнадцатеричных чисел. у меня вопрос, какие побитовые операторы мне нужно использовать, чтобы проверить, находится ли hex_number внутри hex_number2.

1 Ответ

0 голосов
/ 19 апреля 2020

Вы бы использовали &, поразрядное AND.

if hex_number2 & hex_number == hex_number

Если бы исходная вещь, которую вы «объединили» в число, была одним битом (например, 1, 2, 4, 8 , 16, et c.) Вам просто нужно if hex_number2 & hex_number, потому что любой результат, отличный от 0, будет тем, что вы ищете.

Почему это работает:

«Объединение» на самом деле является побитовой OR операцией, поэтому, например, если вы сделаете 5 | 19 (что дает 23), вы будете смотреть на каждый бит в обоих числах, и если один из них 1, результирующий бит также будет 1 (в противном случае 0), например:

 5   00000101 OR
19   00010011 =
-------------
23   00010111

Если вы выполните операцию AND , вы делаете нечто подобное, но каждый результирующий бит равен 1, если , то оба входных битов были 1. Поэтому, если вы сделаете 23 & 19, вы получите 19, но если вы сделаете 23 & 36, вы получите 4.

23   00010111 AND
19   00010011 =
-------------
19   00010011
23   00010111 AND
36   00100100 =
-------------
 4   00000100

Так что вы можете проверить, выполнив if x & y == y. (Тем не менее, это работает только с y, которые являются исключительными друг для друга, по битам, так как они не разделяют биты. В противном случае вы получите ложное срабатывание.)

...