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的二进制补码表示.
dri*_*iis 36
~ 翻转值中的位.
为什么~2是-3有多么的数字来表示逐位做.数字表示为两个补码.
所以,2是二进制值
00000010
Run Code Online (Sandbox Code Playgroud)
并且~2翻转位,所以值现在是:
11111101
Run Code Online (Sandbox Code Playgroud)
其中,是-3的二进制表示.
Mot*_*tti 16
正如其他人所提到的~只是翻转位(将一个变为零,零变为一个),并且由于使用了两个补码,您将得到您看到的结果.
要添加的一件事是为什么使用两个补码,这是因为负数的运算与正数的运算相同.考虑-3到3为了得到零而应该添加的数字,你会看到这个数字是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这是两个.
我知道这个问题的答案已经发布很久了,但是我想分享我的答案。
为了找到一个数字的补码,请首先找到其二进制等价物。在此,十进制数以二进制形式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 0011是3。并且,由于符号位是如上所述的一位,因此得出的答案为-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 的补码)
1000 0000 0000 0000 0000 0000 0000 0101 现在结果是 -5 查看视频链接 <[Java 中的按位运算符] https://youtu.be/w4pJ4cGWe9Y