按位运算符,为什么在应用了NOT运算符的二进制数中加1会使其为负值而不是不同的数字?

Ben*_*enM 0 binary bit-manipulation

我刚刚开始学习Bitwise运算符(尽管我很难找到任何绝对的初学者资源).我理解二进制如何工作以及如何阅读但我不理解以下内容.

如果您使用二进制数37: 00100101并将〜(NOT)运算符应用于它,这些位将被翻转到 11011010 教程中我正在阅读它说你必须添加一个作为一种标志来表示它是否定的.所以它变成了11011011.我不明白为什么这个新号码不仅仅是219.

在相关的说明中,任何人都有任何深入的解释,解释我可以用来真正了解所有这些的所有资源,并最终理解这一切吗?

Pau*_*l R 5

一个位NOT也被称为1的补码.

您可以通过添加1 将1s补码转换为2s补码.

1s补码和2s补码都是表示负数的不同方式,但是现在2s补码几乎是普遍使用的.

因此,要以2s补码形式否定数字,您可以简单地应用按位NOT并添加1,即

-x == ~x + 1
Run Code Online (Sandbox Code Playgroud)

相反,要将2s补码数转换为1s补码,您可以将其否定并减去1:

~x == -x - 1
Run Code Online (Sandbox Code Playgroud)

注意,正数在1s补码和2s补码表示中具有相同的表示 - 它只是存在差异的负数.例如,对于8位整数:

Decimal    1s complement    2s complement
      0         00000000         00000000
     -0         11111111              n/a
      1         00000001         00000001
     -1         11111110         11111111
      2         00000010         00000010
     -2         11111101         11111110
    127         01111111         01111111
   -127         10000000         10000001
   -128              n/a         10000000
Run Code Online (Sandbox Code Playgroud)

注意,1s补码有十个小数0的两个表示:+ 0和-0,而2s补码具有唯一的零表示.2s补码也可以表示1s补码中不可用的附加负值(在8位整数的情况下为-128).

  • 谢谢保罗.在我花了几个小时的研究中,我已经看到了很多1s和2s补充,所以我一定会给他们看看. (2认同)