位运算符(〜)是如何工作的?

为什么〜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的二进制补码表示。

补码操作符(〜)JUST FLIPS BITS。 由机器来解释这些位。

~翻转值中的位。

为什么~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的位是两位。

这个操作是一个补充,而不是一个否定。

考虑到〜0 = -1,并从那里开始工作。

否定的algorithm是“补充,增量”。

你知道吗? 反数对称的,也有“补数”,它有0和a -0。

我知道这个问题的答案是张贴了很久,但我想分享我的答案是一样的。

为了find一个数字的补码,首先find它的二进制等值。 这里,十进制数2以二进制forms表示为0000 0010 。 现在把它的补码反转(将所有的1翻转为0,所有的0翻转为1)将其二进制表示的所有数字取反,这将导致:

 0000 0010 → 1111 1101 

这是十进制数2的补码。由于第一位,即二进制数中的符号位是1,这意味着符号对于它所存储的数字是的。 (这里所指的数字不是 2,而是2的补码)。

现在,由于数字被存储为二进制补码(取一个数的加数),所以为了将这个二进制数1111 1101显示为十进制数,首先我们需要find它的二进制补码,这将是:

 1111 1101 → 0000 0010 + 1 → 0000 0011 

这是2的补充。 二进制数字0000 0011的十进制表示是3 。 而且,由于符号位是上面提到的那个,所以得到的答案是-3

提示:如果仔细阅读这个过程,那么你会发现补码操作符的结果实际上是数字(操作符 – 在这个操作符上应用)加上一个负号。 你也可以用其他号码试试这个。

简单………..

作为任何数字的二进制补码,我们可以通过将全部1反转为0来计算,反之亦然。

这里N =〜N总是产生结果 – (N + 1)。 因为系统以2的补码forms存储数据,这意味着它像这样存储〜N。

  ~N = -(~(~N)+1) =-(N+1). 

例如::

  N = 10 = 1010 Than ~N = 0101 so ~(~N) = 1010 so ~(~N) +1 = 1011 

现在来看Minus来自哪里。 我的意见是假设我们有32位寄存器,这意味着参与操作的2 ^ 31 -1位,并且在通常情况下作为符号位存储的先前计算(补码)中改变的一个位保留一位。 我们得到的结果是〜10 = -11。

〜(-11)= 10;

如果printf(“%d”,〜0); 我们得到结果:-1;

但是printf(“%u”,〜0)的结果是:32位机器上的4294967295。

int a = 4; 的System.out.println(〜A); 结果将是:-5

java中任何整数的“〜”代表no的1的补码。 例如,我正在取-4,这意味着二进制表示0100.首先,一个整数的长度是四个字节,即4 * 8(1个字节的8位)= 32。 所以在系统存储器4中表示为0000 0000 0000 0000 0000 0000 0000 0100现在〜运算符将对上述二进制数字执行1的补码

即1111 1111 1111 1111 1111 1111 1111 1011-> 1的补码,如果最高有效位是1(或 – 或+)的符号,则为1,则符号为“ – ”,如果是0,则符号为“+”这个结果是一个负数,在Java中,负数以二进制补码forms存储,获得的结果我们必须转换成二进制补码(首先执行1的补码,然后加1到1的补码)。 除了最重要的比特1(这是我们的数字的符号表示,这意味着剩余的31比特)1111 1111 1111 1111 1111 1111 1111 1011(〜运算符的获得结果)1000 0000 0000 0000 0000 0000 0000 0100(1的补码)

1(2的补码)

1000 0000 0000 0000 0000 0000 0000 0101现在结果是-5查看这个链接的video<[Java中的位运算符] https://youtu.be/w4pJ4cGWe9Y


按位互补运算符(〜)是一元运算符。

它按照以下方法工作

首先它将给定的十进制数字转换为相应的二进制数值。也就是说在2的情况下,首先将2转换为0000 0010(转换为8位二进制数字)。

然后将数字中的1全部转换为0,将全部的0全部转换为1,然后数字变成1111 1101。

这是-3的2的补码表示。

为了find使用补码的无符号值,也就是简单地将1111 1101转换为十进制(= 4294967293),我们可以在打印过程中简单地使用%u。

我认为对于大多数人来说,混淆部分来自十进制数和带符号二进制数的区别,所以先澄清一下:

对于人类的小数点世界:01表示1,-01表示-1,对于计算机的二进制世界:101表示无符号的5。 101表示(-4 + 1),如果是有符号的数字位于x位置。 | X

所以2的翻转位=〜2 =〜(010)= 101 = -4 + 1 = -3混淆来自混合有符号结果(101 = -3)和不合并结果(101 = 5)

首先,我们必须将给定的数字分成二进制数字,然后通过在最后一个二进制数字上加上来反转它。在这个执行之后,我们必须给出前一个数字的相反符号,我们正在find这个完整的〜2 = -3解释:2s二进制forms是00000010变成11111101这是补码,然后补全00000010 + 1 = 00000011这是二进制forms的三个并且带有-sign Ie,-3

按位运算符是根据我的经验和知识在符号和大小方法上工作的一元运算符。

例如〜2会导致-3。

这是因为按位运算符将首先表示符号和幅度中的数字,它是0000 0010(8位运算符),其中MSB是符号位。

然后,它将采取-2的负数,这是-2。

-2在符号和大小上表示为1000 0010(8位算子)。

后来它给LSB(1000 0010 + 1)增加1,给你1000 0011。

这是-3。

Javascript tilde(〜)强制给定的值补全 – 所有的位都是相反的。 这一切都代替了。 这不是标志。 它既不增加也不减less任何数量。

 0 -> 1 1 -> 0 ...in every bit position [0...integer nbr of bits - 1] 

在使用JavaScript等高级语言的标准桌面处理器上,BASE10符号算术是最常见的,但请记住,它不是唯一的。 CPU级的位可以根据许多因素进行解释。 在“代码”级别,在这种情况下,JavaScript被定义为一个32位有符号整数(让我们把浮点数从这里除去)。 把它看作是量子的,这些32位一次代表许多可能的值。 这完全取决于你通过转换镜头。

 JavaScript Tilde operation (1's complement) BASE2 lens ~0001 -> 1110 - end result of ~ bitwise operation BASE10 Signed lens (typical JS implementation) ~1 -> -2 BASE10 Unsigned lens ~1 -> 14 

以上所有都是真实的。

Interesting Posts