~
运算符是如何工作的?~
运算符是如何工作的?请记住,负数是以其正数补码的形式存储的。例如,这是-2在二进制补码中的表示方式:(8位)
1111 1110
0000 0010
只需翻转所有位,我们就得到:
1111 1101
那么,在二进制补码中,-3是什么样子的呢?先从正数3开始:0000 0011,将所有位取反得到1111 1100,再加上1变成负数(-3),即1111 1101。
因此,如果你简单地反转2的位,就可以得到-3的二进制补码表示。
~
操作会将数值中所有的位都取反。
为什么~2
的结果是-3
,与数字的二进制位表示方式有关。数字使用二进制补码表示。
因此,2的二进制值为
00000010
当使用 ~2 操作时,会翻转二进制位,因此该值现在为:
11111101
这是 -3 的二进制表示。
System.out.println((byte)(~2));
输出的仍然是 -3 而不是 253?能否解释一下原因? - zipper正如其他人所提到的,~
只是翻转位(将1变为0,将0变为1),由于使用了二进制补码,所以你看到了结果。
有一件事需要补充的是,为什么要使用二进制补码,这是为了对负数进行的操作与对正数进行的操作相同。想象一下-3
是哪个数字,加上3
可以得到零,你会发现这个数字是1101
,记住二进制的加法就像小学(十进制)加法一样,当你达到2时要进位而不是10。
1101 +
0011 // 3
=
10000
=
0000 // lose carry bit because integers have a constant number of bits.
因此,1101
是 -3
,翻转这些位,你会得到 0010
,即为二。
这个操作是一种补码运算,而不是取反运算。
考虑到 ~0 = -1,并从此开始计算。
取反的算法是“补码运算,加一”。
你知道吗?还有一种“反码运算”,其中逆数是对称的,并且它有一个 0 和一个 -0。
2
被表示为二进制形式的 0000 0010
。现在通过反转(将所有1翻转成0,将所有0翻转成1)它的二进制表示中的所有数字来得到它的补码,结果如下:0000 0010 → 1111 1101
1111 1101
显示为十进制数,首先需要找到它的二进制补码,即:1111 1101 → 0000 0010 + 1 → 0000 0011
0000 0011
的十进制表示为 3
。由于上面提到的符号位为1,因此最终答案为-3
。add, flip, add
。0010
-> 0011
-> 1100
-> 1101
。 - Braden Bestint a=4; System.out.println(~a); 结果为:-5
在Java中,对于任何整数,'~'都代表该数字的1's补码。 例如,我要取~4,这意味着在二进制表示中为0100。 首先, 整数的长度为四个字节,即4*8(1个字节为8位)=32。 因此,在系统内存中,4被表示为 0000 0000 0000 0000 0000 0000 0000 0100 现在,~运算符将在上述二进制数上执行1's补码
即1111 1111 1111 1111 1111 1111 1111 1011->1's补码 最高有效位表示数字的符号(负或正) 如果它是1,则符号为'-' 如果它是0,则符号为'+' 根据这个,我们的结果是一个负数, 在Java中,负数以2's补码形式存储, 我们必须将获得的结果转换为2's补码(首先执行1's补码,然后只需添加1到1's补码)。 所有的1都会变成零,除了最重要的一位1(它是我们数字的符号表示,这意味着对于其余的31位 1111 1111 1111 1111 1111 1111 1111 1011(~运算符的获得结果) 1000 0000 0000 0000 0000 0000 0000 0100(1's补码)
1000 0000 0000 0000 0000 0000 0000 0101 现在结果为-5 查看此链接以观看视频 <[Java中的位运算符] https://youtu.be/w4pJ4cGWe9Y
简单地说,2的补码可以通过将所有的1反转为0,所有的0反转为1,然后加上1来计算任何数字的补码。
当N=~N时,结果总是-(N+1)。因为系统以2的补码形式存储数据,这意味着它像这样存储~N。
~N = -(~(~N)+1) =-(N+1).
N = 10 = 1010
Than ~N = 0101
so ~(~N) = 1010
so ~(~N) +1 = 1011
按位取反(~)是一种一元运算符。
它的工作原理如下:
首先,将给定的十进制数转换为相应的二进制值。例如,在输入2后,它会将2转换为 0000 0010(8位二进制数)。
然后,将数字中的所有1变为0,将所有0变为1;这样,该数字就变成了1111 1101。
这就是表示-3的二进制的补码形式。
为了使用补码找到无符号值,即将 1111 1101 转换为十进制 (=4294967293),我们可以在打印时简单地使用 %u。
很简单:
Before starting please remember that
1 Positive numbers are represented directly into the memory.
2. Whereas, negative numbers are stored in the form of 2's compliment.
3. If MSB(Most Significant bit) is 1 then the number is negative otherwise number is
positive.
您正在查找 ~2:
Step:1 Represent 2 in a binary format
We will get, 0000 0010
Step:2 Now we have to find ~2(means 1's compliment of 2)
1's compliment
0000 0010 =================> 1111 1101
So, ~2 === 1111 1101, Here MSB(Most significant Bit) is 1(means negative value). So,
In memory it will be represented as 2's compliment(To find 2's compliment first we
have to find 1's compliment and then add 1 to it.)
Step3: Finding 2's compliment of ~2 i.e 1111 1101
1's compliment Adding 1 to it
1111 1101 =====================> 0000 0010 =================> 0000 0010
+ 1
---------
0000 0011
So, 2's compliment of 1111 1101, is 0000 0011
Step4: Converting back to decimal format.
binary format
0000 0011 ==============> 3
In step2: we have seen that the number is negative number so the final answer would
be -3
So, ~2 === -3
简单来说,~
就是要找到对称值(相对于-0.5)。
~a
和 a
应该在0和-1的中间镜子的对称位置上对称。
-5,-4,-3,-2,-1 | 0, 1, 2, 3, 4
~0 == -1
~1 == -2
~2 == -3
~3 == -4
1
进行计数,那么负数将使用 0
。1111 1111 == -1
1111 1110 == -2; // add one more '0' to '1111 1111'
1111 1101 == -3; // add one more '0' to '1111 1110'
最后,~i == -(i+1)
。