Ant*_*ony 261

请记住,负数存储为正对应的两个补码.作为一个例子,这里是二进制补码中-2的表示:(8位)

1111 1110
Run Code Online (Sandbox Code Playgroud)

你得到这个的方法是取一个数字的二进制表示,取其补码(反转所有位)并加一个.两个开始为0000 0010,通过反转我们得到的位1111 1101.添加一个得到我们上面的结果.第一位是符号位,表示负数.

那么让我们来看看我们如何得到~2 = -3:

这是两个:

0000 0010
Run Code Online (Sandbox Code Playgroud)

只需翻转所有位,我们得到:

1111 1101
Run Code Online (Sandbox Code Playgroud)

嗯,在二补码中-3是什么样的?从正3:0000 0011开始,将所有位翻转到1111 1100,并加1以变为负值(-3),1111 1101.

因此,如果您只是将2中的位反转,则得到-3的二进制补码表示.

补码运算符(〜)JUST FLIPS BITS.由机器来解释这些位.

  • 还有一点可以提一下,在添加1之前,翻转被称为1s补码. (38认同)
  • 它可能会帮助那些不了解One's Complement和Two's Complement的人.在这里阅读它们.http://en.wikipedia.org/wiki/Ones%27_complement http://en.wikipedia.org/wiki/Two%27s_complement (3认同)
  • 机器如何知道它得到一个两个补数的负数而不是一个更高的正数?是因为相应语言的类型系统表明该类型是有符号整数而非无符号整数? (3认同)

dri*_*iis 36

~ 翻转值中的位.

为什么~2-3有多么的数字来表示逐位做.数字表示为两个补码.

所以,2是二进制值

00000010
Run Code Online (Sandbox Code Playgroud)

并且~2翻转位,所以值现在是:

11111101
Run Code Online (Sandbox Code Playgroud)

其中,是-3的二进制表示.

  • 取决于它是否表示有符号或无符号整数. (7认同)
  • 是不是11111101 ==十进制253 vs -3? (2认同)

Mot*_*tti 16

正如其他人所提到的~只是翻转位(将一个变为零,零变为一个),并且由于使用了两个补码,您将得到您看到的结果.

要添加的一件事是为什么使用两个补码,这是因为负数的运算与正数的运算相同.考虑-33为了得到零而应该添加的数字,你会看到这个数字是1101,记住二进制加法就像小学(十进制)加法只有当你得到两个而不是10时才携带一个.

 1101 +
 0011 // 3
    =
10000
    =
 0000 // lose carry bit because integers have a constant number of bits.
Run Code Online (Sandbox Code Playgroud)

因此1101就是-3,翻转你的位0010这是两个.


gba*_*rry 8

这种操作是一种补充,而不是否定.

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

否定算法是"补充,增量".

你知道吗?还有"一个补码",其中倒数对称的,并且它具有0和-0.


Him*_*wal 6

我知道这个问题的答案已经发布很久了,但是我想分享我的答案。

为了找到一个数字的补码,请首先找到其二进制等价物。在此,十进制数以二进制形式2表示0000 0010。现在,通过将其二进制表示的所有数字取反(将全1翻转为0,将全0翻转为1)来得到其补码,这将导致:

0000 0010 ? 1111 1101
Run Code Online (Sandbox Code Playgroud)

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

现在,由于数字存储为2的补数(取数字的1的补数加1),因此要将此二进制数显示1111 1101为十进制,首先我们需要找到其2的补数,即:

1111 1101 ? 0000 0010 + 1 ? 0000 0011
Run Code Online (Sandbox Code Playgroud)

这是2的补码。二进制数的十进制表示形式0000 00113。并且,由于符号位是如上所述的一位,因此得出的答案为-3

提示:如果仔细阅读此过程,则可能会发现一个人的补数运算符的结果实际上是数字(操作数-应用此运算符的对象)加上一个带负号的数字。您也可以尝试使用其他号码。


小智 6

整数a=4;System.out.println(~a); 结果将是:-5

java中任何整数的'~'都表示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 的补码最高有效位表示 no 的符号(- 或 +),如果为 1,则符号为“-”,如果为 0,则符号为“+”我们的结果是一个负数,在java中负数以2的补码形式存储,我们必须将获得的结果转换为2的补码(首先执行1的补码,然后将1与1的补码相加)。除了最高有效位 1(这是我们的数字符号表示形式,这意味着剩余的 31 位 1111 1111 1111 1111 1111 1111 1111 1011 (~ 运算符获得的结果)之外,所有 1 都将变为 0 1000 0000 0000 0000 0000 0000 0000 0100(1 的补码)

1(2的补码)

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