【问题标题】: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

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


【解决方案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】:
        猜你喜欢
        • 1970-01-01
        • 2017-07-27
        • 2014-08-06
        • 1970-01-01
        • 1970-01-01
        • 2014-07-01
        • 1970-01-01
        • 2020-04-07
        • 1970-01-01
        相关资源
        最近更新 更多