为啥这个逻辑/按位运算返回 1?

Posted

技术标签:

【中文标题】为啥这个逻辑/按位运算返回 1?【英文标题】:Why does this logical/bitwise operation return 1?为什么这个逻辑/按位运算返回 1? 【发布时间】:2013-01-21 02:38:28 【问题描述】:

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

0x0102 && (0xff << 8)

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

【问题讨论】:

我明白了 - 我被 bitshift 挂断了。它返回 0xff00,而不是 0x00。逻辑 && 然后返回 1。 这可能有助于说明:ideone.com/Xdrixx 【参考方案1】:

(0xff &lt;&lt; 8) 产生0xff00。与0x0102 进行按位与运算将产生0x0100(即true)。

但是,您没有进行按位与。 &amp;&amp; 是逻辑与。 &amp; 是按位与。你基本上在做的是if 0x0102trueif (0xff &lt;&lt; 8)true,由于参数非零,导致true(它被转换为1)。

【讨论】:

【参考方案2】:

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

试试

0x0102 & (0xff << 8)

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

0xFF 是一个int。通常它是 16 位或 32 位,具体取决于编译器设置。所以左移 8 位得到0xFF00

【讨论】:

【参考方案3】:

&amp;&amp; 是逻辑与。你想要按位 AND &amp;,例如

0x0102 & (0xff << 8)

此外,将0xff 向左移动八位会得到0xff00,因为按位算术是整数而不是字节。

【讨论】:

【参考方案4】:

整数常量不是简单的8位组成的,0xFF &lt;&lt; 8就是0xFF00

【讨论】:

我不知道为什么有人这样做 -1,所以我 +1 答案。 @RichardSchneider 谢谢,也许有人认为我错过了逻辑 X 按位和的一部分,但我真的不认为会是这种情况,因为答案完全适合“逻辑与”场景,而且我没有发现任何证据表明使用它是错误的,或者它应该是“按位与”。【参考方案5】:

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

0xff

【讨论】:

以上是关于为啥这个逻辑/按位运算返回 1?的主要内容,如果未能解决你的问题,请参考以下文章

当按位运算符做同样的事情时,为啥要使用逻辑运算符?

按位运算的意外结果为啥 (1 | 1 & 2) 给出 1 而不是 2?

C# 逻辑位运符及运算原理 按位操作二进制

C# 逻辑位运符及运算原理 按位操作二进制

C# 逻辑位运符及运算原理 按位操作二进制

为啥 tslint 中不允许按位运算符?