为啥这个逻辑/按位运算返回 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 << 8)
产生0xff00
。与0x0102
进行按位与运算将产生0x0100
(即true
)。
但是,您没有进行按位与。 &&
是逻辑与。 &
是按位与。你基本上在做的是if 0x0102
是true
和if (0xff << 8)
是true
,由于参数非零,导致true
(它被转换为1)。
【讨论】:
【参考方案2】:您使用的是logical AND
,而不是bitwise AND
。将&&
替换为&
。
试试
0x0102 & (0xff << 8)
据我了解,将 0xff 向左移动 8 位会导致 0x00;和任何东西都会导致0x00。我哪里错了?
0xFF 是一个int
。通常它是 16 位或 32 位,具体取决于编译器设置。所以左移 8 位得到0xFF00
。
【讨论】:
【参考方案3】:&&
是逻辑与。你想要按位 AND &
,例如
0x0102 & (0xff << 8)
此外,将0xff
向左移动八位会得到0xff00
,因为按位算术是整数而不是字节。
【讨论】:
【参考方案4】:整数常量不是简单的8位组成的,0xFF << 8
就是0xFF00
。
【讨论】:
我不知道为什么有人这样做 -1,所以我 +1 答案。 @RichardSchneider 谢谢,也许有人认为我错过了逻辑 X 按位和的一部分,但我真的不认为会是这种情况,因为答案完全适合“逻辑与”场景,而且我没有发现任何证据表明使用它是错误的,或者它应该是“按位与”。【参考方案5】:见In C Left shift (char) 0xFF by 8 and cast it to int
0xff
【讨论】:
以上是关于为啥这个逻辑/按位运算返回 1?的主要内容,如果未能解决你的问题,请参考以下文章