位运算符(〜)如何工作?
为什么〜2是-3?
请记住负数存储为正数的二进制补码 。 作为一个例子,下面是用二进制补码表示-2:(8位)
1111 1110
你得到这个的方式是通过一个数字的二进制表示,取其补数(反转所有位)并加一个。 两个从0000 0010开始,通过反转我们得到的位1111 1101.添加一个得到我们上面的结果。 第一位是符号位,暗示负面。
那么让我们来看看我们如何得到〜2 = -3:
再来两个:
0000 0010
简单地翻转所有的位,我们得到:
1111 1101
那么,二进制补码中的-3是什么? 从正值3:0000 0011开始,将所有位全部翻转到1111 1100,并添加一个变为负值(-3),1111 1101。
所以,如果你简单地反转2中的位,就会得到-3的二进制补码表示。
补码操作符(〜)只是FLIPS位。 由机器来解释这些位。
~
翻转值中的位。
为什么~2
是-3
与数字如何按位表示有关。 数字表示为二进制补码。
所以,2是二进制值
00000010
并且〜2翻转位,所以现在的值是:
11111101
其中,-3是二进制表示。
正如其他人提到的~
只是翻转位(将一个零变为零),并且由于使用了二进制补码,您可以看到您看到的结果。
有一点需要补充的是,为什么使用二进制补码,这是因为负数运算与正数运算相同。 把-3
看作是为了得到零而添加3
的数字,你会发现这个数字是1101
,记住二进制加法就像小学(十进制)加法一样,只有当你得到两个而不是十个。
1101 +
0011 // 3
=
10000
=
0000 // lose carry bit because integers have a constant number of bits.
因此1101
是-3
,翻转你得到的0010
这是两位。