Ben*_*enM 0 binary bit-manipulation
我刚刚开始学习Bitwise运算符(尽管我很难找到任何绝对的初学者资源).我理解二进制如何工作以及如何阅读但我不理解以下内容.
如果您使用二进制数37:
00100101并将〜(NOT)运算符应用于它,这些位将被翻转到
11011010
教程中我正在阅读它说你必须添加一个作为一种标志来表示它是否定的.所以它变成了11011011.我不明白为什么这个新号码不仅仅是219.
在相关的说明中,任何人都有任何深入的解释,解释我可以用来真正了解所有这些的所有资源,并最终理解这一切吗?
您可以通过添加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).