Это правильные значения определений:
#define BITMASK_CAN_JUMP 1 << 0 // 0b0001
#define BITMASK_CAN_WALK 1 << 1 // 0b0010
Возможно, вы по крайней мере захотите поставить скобки вокруг 1 << 0
и 1 << 1
, но это уже другая история.В любом случае, data
становится 0b10 | 0b01
, что составляет 0b11
или 3
в десятичном виде.
(data & BITMASK_CAN_WALK)
равно 0b11 & 0b10
, что составляет 0b10
или 2
в десятичном виде.
Следовательно, if (data & BITMASK_CAN_WALK)
берется, потому что это не 0
(в C ++ оно будет неявно приведено к true
), и оно печатает вышеупомянутый 2
.Если вы измените спецификатор формата на #010x
, вы увидите, что это действительно 0x2
.
Ничто здесь не имеет значения 0x0010
(16
в десятичном виде), возможно, есть ошибка отображения, есливы видите это значение.