为什么这个逻辑/按位操作返回1?

时间:2013-02-06 01:08:50

标签: c logic bit-manipulation boolean-logic conditional-statements

我不明白为什么以下内容会返回1:

0x0102 && (0xff << 8)

根据我的理解,将0xff向左移位8位会导致0x00;和anding任何东西都会导致0x00。我哪里错了?

5 个答案:

答案 0 :(得分:3)

您使用的是logical AND,而不是bitwise AND。将&&替换为&

尝试

0x0102 & (0xff << 8)
  

根据我的理解,向左移位位数为0x8,导致0x00;并且任何事情都会导致0x00。我哪里错了?

0xFF是int。通常它是16位或32位,具体取决于编译器设置。因此,向左移8位会产生0xFF00

答案 1 :(得分:3)

(0xff << 8)会产生0xff00。与0x0102进行按位AND运算将产生0x0100true)。

但是,你没有做一个按位AND。 &&是合乎逻辑的AND。 &是按位AND。你基本上做的是if 0x0102trueif (0xff << 8)true,由于参数不为零,因此导致true(转换为1)。

答案 2 :(得分:2)

&&是合乎逻辑的AND。你想要按位AND &,例如

0x0102 & (0xff << 8)

此外,将0xff向左移位8会产生0xff00,因为逐位算术是整数而不是字节。

答案 3 :(得分:1)

整数常量不仅由8位组成,0xFF << 80xFF00

答案 4 :(得分:0)

请参阅In C Left shift (char) 0xFF by 8 and cast it to int

0xff&lt;&lt; 8收益率-256。由于AND逻辑门的两侧都不为0,因此它将返回true或1。