【问题标题】:Why does (~10) equal -11 in C++ (bitwise operators)为什么 (~10) 在 C++ 中等于 -11(按位运算符)
【发布时间】:2018-07-15 18:52:46
【问题描述】:

我正在学习 C++,想知道为什么会这样。

我知道第一位处理值是否为负。

但是,如果你有 0 1 0 1 0 并且做 ~,你会得到 1 0 1 0 1 对吗?

请有人帮我解决这个问题。谢谢!

【问题讨论】:

  • 请添加导致这种混乱的代码。
  • 高度相关(如果不是骗子):stackoverflow.com/questions/655257/…
  • 那么你认为 1 0 1 0 1 应该是什么值?我希望您认为它应该是-5,如果您的计算机使用有符号幅度,那将是正确的,但几乎每台计算机都使用称为二的补码的不同系统。谷歌一下,它会解释一切。
  • 没有代码,只有概念。
  • 这里有一些让你大吃一惊的东西。 ~0 不是 -0,没有这样的东西。 〜0给你-1。想一想,花几分钟,也许你会更清楚。

标签: c++ bit-manipulation


【解决方案1】:

但是,如果你有 0 1 0 1 0 并且做 ~,你会得到 1 0 1 0 1 对吗?

如果你只看这 5 位,那就是真的。如果int 用 32 位表示,那么还有 27 位是您没有考虑的。左边有 27 个零位来表示数字 10。因此,~10 左边有 27 位是 1。

你得到的是:

1 1 1 1 1 1 1 1  1 1 1 1 1 1 1 1  1 1 1 1 1 1 1 1  1 1 1 1 0 1 0 1

在二进制补码表示中,该数字为 -11。

【讨论】:

    【解决方案2】:

    大多数处理器使用一种称为二进制补码的方法来存储负数。

    这种方法虽然从正 2 负中剪裁似乎有点开销,但对加/减数字有很好的影响。

    您可以在许多示例中查看二进制补码的工作原理 (here is one)

    我不喜欢弄乱这些位,所以我使用不同的方法,
    为了让您对二进制补码有一个直觉,我会详细说明。

    二进制补码将范围分为两部分:
    所以在你的 5 位示例 [0, (2^5-1)=31]:

    签名会将其分为两部分:
    - 首先从 0 到 15...
    - 第二从 -16 到 -1...

    因此你的例子:

    • 10101 = 21...
    • 21 落在第二部分,所以我们从中减去一半的大小 (16) >> 21-16=5
    • 现在,将其添加到第二部分窥视值 (-16) >> -16 + 5 = -11

    希望我已经足够清楚了......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-09-24
      • 2015-10-22
      • 2016-07-11
      • 2019-02-21
      • 1970-01-01
      • 1970-01-01
      • 2022-03-30
      • 2020-04-07
      相关资源
      最近更新 更多