【问题标题】:Why is ~0xF equal to 0xFFFFFFF0 on a 32-bit machine?为什么在 32 位机器上 ~0xF 等于 0xFFFFFFF0?
【发布时间】:2012-09-13 03:08:09
【问题描述】:

为什么~0xF 等于 0xFFFFFFF0?

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

【问题讨论】:

  • && 是逻辑与,而不是按位与。 ~ 是标准的按位运算。
  • 我知道 ~ 做什么,但我认为 0xF(即使在 32 位上)会是 0x11111111?
  • 0xF0x0000000F。在哪个世界里这等于0x11111111
  • 我想我明白了,0xF 是 0x1,但是在 32 位上,我们必须添加 0 的填充,对吗?这使它成为0x0000000F,对吗?
  • " 0xF 是 0x1" -- 不,0xF 是 0xF。 “我们必须添加 0 的填充对吗?这使它成为 0x0000000F,对吧?” 0xF == 0x0F == 0x00F == 0x000F ... == 0x0000000F == 0x0000000000000000000000000000000000000000000000000F 在所有机器上。

标签: c operators


【解决方案1】:

问题 1

为什么~0xF 等于 0xFFFFFFF0?

首先,这意味着您在 32 位机器上运行它。这意味着0xF实际上是0x0000000F in hexadecimal

这意味着 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。请注意0x10x010x0010x0001 都是相同的。所以让我们把这个十六进制数改为二进制表示:

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

您可以here获取更多信息。

【讨论】:

  • 只是为了记录,为 AND、OR 和 XOR 给出的规则列表称为真值表,如果它更容易找到的话。
【解决方案2】:

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

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

他们给出了很好的解释

【讨论】:

  • 即使对于 C 也是如此。0x 表示十六进制表示。 @oldrinb
  • 请参阅 C99 标准的 §6.4.4.1¶5。 0xF 使用 int 表示 :-)
【解决方案3】:

您正在否定 0xF,这会将所有位翻转为它们的倒数。例如,你有 8 位:0xF = 00001111。如果你否定它,它会变成11110000

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      ~0xF 反转所有位,继续

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

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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          猜你喜欢
          • 2017-07-16
          • 2014-03-25
          • 1970-01-01
          • 2013-02-27
          • 1970-01-01
          • 2011-02-11
          • 2010-09-27
          • 1970-01-01
          • 2014-06-27
          相关资源
          最近更新 更多