为什么~0xF 等于 0xFFFFFFF0?
另外,怎么样~0xF && 0x01 = 1
?也许我也没有得到 0x01 。
问题 1
为什么~0xF 等于 0xFFFFFFF0?
首先,这意味着您在 32 位机器上运行它。这意味着 0xF 实际上0x0000000F
是十六进制的,
这意味着 0xF 是
0000 0000 0000 0000 0000 0000 0000 1111
二进制表示的。
~
运算符表示 NOT 运算。Tt在二进制表示中每 0 到 1 和每 1 到 0变化一次。这将使 ~0xF 成为:
1111 1111 1111 1111 1111 1111 1111 0000
二进制表示。
这实际上是0xFFFFFFF0
。
请注意,如果您在 16 位机器上执行此操作,则答案~0xF
将是0xFFF0
.
问题2
你写错了,应该是0xF & 0x1
。请注意0x1
0x01
,0x001
、 和0x0001
都是相同的。所以让我们把这个十六进制数改为二进制表示:
0xF
将会:
0000 0000 0000 0000 0000 0000 0000 1111
并且0x1
将是:
0000 0000 0000 0000 0000 0000 0000 0001
&
操作遵循以下规则:
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
所以对每一点都这样做,你会得到结果:
0000 0000 0000 0000 0000 0000 0000 0001
这实际上是0x1
。
额外的
|
表示按位或运算。它跟随:
0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1
^
表示按位异或运算。它跟随:
0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0
您可以在此处获得更多信息。
如果将 0xF 存储在 32 位“int”中,则所有 32 位都会翻转,因此 ~0xF = 0xFFFFFFF0。
看到这个: http ://teaching.idallen.com/cst8214/08w/notes/bit_operations.txt
他们给出了很好的解释
您正在否定 0xF,它将所有位翻转到它们的反相。因此,例如,您有 8 位:0xF = 00001111
. 如果你否定它,它会变成11110000
.
由于您使用的是 32 位,因此 F 只是一直延伸。1111 .... 0000
对于第二个问题,您使用的是逻辑与,而不是按位与。两者的行为完全不同。
听起来您的困惑是您认为 0xF 与 0b1111111111111111 相同。不是,它是 0b0000000000001111。
~0xF 反转所有位,继续
from 0x0000000F = 00000000000000000000000000001111 (32 bits)
to 0xFFFFFFF0 = 11111111111111111111111111110000 (32 bits)
如果 a 和 b 都非零,并且 ~0xF 和 0x01 都非零,则 a && b 为 1。
在 C 中,~0xF
永远不能等于0xFFFFFFF0
。前者是负数(在 C 允许的三种有符号表示中的任何一种中),后者是正数。但是,如果在二进制补码实现中两者都转换为 32 位无符号类型,则转换后的值将相等。
至于~0xF && 0x01
,&&
运算符是逻辑与,而不是按位与。