Побитовые операции становятся намного проще для понимания, если вы на самом деле пишете их на листе бумаги в виде двоичных значений
Вы 15 (десятичное) в двоичном виде 1111 (2 ^ 3 + 2 ^ 2 + 2)^ 1 + 2 ^ 0) = (8 + 4 + 2 + 1)
8 (десятичное число) в двоичном виде 1000 (2 ^ 3 + 0 + 0 + 0) = (8 + 0 + 0 + 0)
A логический и означает, что для каждого бита, если оба значения равны 1, результат равен 1, в противном случае 0
In our case the (Y means both are 1 and N means one or both have a 0):
1111
1000
----
YNNN
Or in it's binary result
1000
Так для записи:Результатом логической операции И является число, а не истина / ложь.Поскольку вы хотите, чтобы результат имел все биты из набора KBDI_KEYBOARD_ALPHA_NUM, я бы предпочел проверить вот так
if ((returnValue & KBDI_KEYBOARD_ALPHA_NUM) == KBDI_KEYBOARD_ALPHA_NUM) { /* YES */ }
Я бы сравнил результат с! = 0только если я хочу, чтобы любой битов в KBDI_KEYBOARD_ALPHA_NUM был установлен.Поскольку в этом случае задействован только 1 бит, оба будут работать одинаково.Но чтобы проиллюстрировать разницу:
const uint NEED_ALL_THESE_BITS = 0x0009; // Binary: 1001
uint result = 3; // Binary: 0011;
((result & NEED_ALL_THESE_BITS) != 0) --> True
((result & NEED_ALL_THESE_BITS) == NEED_ALL_THESE_BITS) --> False
Сравнение с! = 0, когда вы хотите установить все биты, не делает ваш код самоочевидным