我试图评估按位与运算结果的评估方式。我在Windows上使用Qt Creator + GDB + MingW。
我做了一个简单的测试:
#define BITMASK_CAN_JUMP 1 << 0 // 0x0001
#define BITMASK_CAN_WALK 1 << 1 // 0x0010
unsigned int data = BITMASK_CAN_JUMP | BITMASK_CAN_WALK;
...
if (data & BITMASK_CAN_WALK) {
printf("%d", data & BITMASK_CAN_WALK);
printf("can walk\n");
}
...
在GDB中为(data&0x0010)设置手表会给我值0,因为0x0010 = 0b10000是正确的。 if条件的值为true,因为该值的值为2。在我看来,调试器通过将0x0010视为十六进制值来正确运行,而程序本身进行了某种隐式转换,例如将数据后面的值转换为十六进制值。我不明白为什么在使用GDB时,数据为什么也不会转换成十六进制。 有人可以帮我弄清楚情况吗?
最佳 汤姆
答案 0 :(得分:1)
这些是定义的正确值:
#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
),如果看到该值,可能会显示错误。