5

为什么~0xF 等于 0xFFFFFFF0?

另外,怎么样~0xF && 0x01 = 1?也许我也没有得到 0x01 。

4

6 回答 6

16

问题 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 0x010x001、 和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

您可以在此处获得更多信息。

于 2012-09-13T03:22:57.893 回答
3

如果将 0xF 存储在 32 位“int”中,则所有 32 位都会翻转,因此 ~0xF = 0xFFFFFFF0。

看到这个: http ://teaching.idallen.com/cst8214/08w/notes/bit_operations.txt

他们给出了很好的解释

于 2012-09-13T03:10:48.347 回答
0

您正在否定 0xF,它将所有位翻转到它们的反相。因此,例如,您有 8 位:0xF = 00001111. 如果你否定它,它会变成11110000.

由于您使用的是 32 位,因此 F 只是一直延伸。1111 .... 0000

对于第二个问题,您使用的是逻辑与,而不是按位与。两者的行为完全不同。

于 2012-09-13T03:15:22.263 回答
0

听起来您的困惑是您认为 0xF 与 0b1111111111111111 相同。不是,它是 0b0000000000001111。

于 2012-09-13T03:15:25.290 回答
0

~0xF 反转所有位,继续

from 0x0000000F = 00000000000000000000000000001111 (32 bits) 
to   0xFFFFFFF0 = 11111111111111111111111111110000 (32 bits)

如果 a 和 b 都非零,并且 ~0xF 和 0x01 都非零,则 a && b 为 1。

于 2012-09-13T03:29:02.933 回答
0

在 C 中,~0xF永远不能等于0xFFFFFFF0。前者是负数(在 C 允许的三种有符号表示中的任何一种中),后者是正数。但是,如果在二进制补码实现中两者都转换为 32 位无符号类型,则转换后的值将相等。

至于~0xF && 0x01&&运算符是逻辑与,而不是按位与。

于 2012-09-13T04:06:58.983 回答