我不明白为什么以下返回 1:
0x0102 && (0xff << 8)
据我了解,向左移位0xff
八位会导致0x00
; 任何事情都会anding
导致0x00。我哪里错了?
我不明白为什么以下返回 1:
0x0102 && (0xff << 8)
据我了解,向左移位0xff
八位会导致0x00
; 任何事情都会anding
导致0x00。我哪里错了?
你正在使用logical AND
,不是bitwise AND
。替换&&
为&
。
尝试
0x0102 & (0xff << 8)
据我了解,将 0xff 向左移动 8 位会导致 0x00;和任何东西都会导致0x00。我哪里错了?
0xFF 是一个int
. 通常它是 16 位或 32 位,具体取决于编译器设置。所以左移 8 位结果是0xFF00
.
(0xff << 8)
结果0xff00
。按位与0x0102
将产生0x0100
(即true
)。
但是,你没有做按位与。&&
是逻辑与。&
是按位与。您基本上要做的if 0x0102
是true
AND if (0xff << 8)
is true
,由于参数不为零,true
因此会导致(转换为 1)。
&&
是逻辑与。你想要按位 AND &
,例如
0x0102 & (0xff << 8)
此外,向左移位0xff
八位会导致0xff00
,因为按位算术是整数而不是字节。
一个整数常量不是由简单的 8 位组成的,0xFF << 8
是0xFF00
.
请参见In C Left shift (char) 0xFF by 8 并将其转换为 int
0xff << 8 产生 -256。由于 AND 逻辑门的两边都不为 0,所以它会返回 true 或 1。