java 中的 ~ 取补码的详细意思是什么 ?

作者&投稿:姚泄 (若有异议请与网页底部的电邮联系)
菜鸟求教:java 中的“取补码”问题!?~

~ (位运算符),按位非,其运算法则为:如果某个数对应位上是1,则该位上最后得到的结果就是0;反之,如果某个数对应位上是0,则该位上最后得到的结果就是1.也就是有些人说的取反的意思,记住取反是在其转化为二进制后进行的。

补码的运算楼主可以看看:2的补码为

2转换为二进制 ~ 00000010
结果 11111101
可以看出结果为一个负数,因为最高位为符号位,1为负数,0为正数。负数的补码的规则为取反再加1,过程为 11111101
取反 00000010
加1 00000011
最后把00000011转为十进制3,但不要丢了符号,因此2的补码为-3.


不知楼主看懂了么。


ps:楼主应该知道十进制、二进制、八进制、十六进制的相互转换吧,不知道的话,可要好好补补啊!

在 Java 中 ~ 表示取反,例如 n=6,在内存中是 00000110,~n 就是取反操作得到 11111001,因为符号位是 1 表示是个负数,在 Java 中负数是用补码来保存的,因此 11111001 是一个补码,要将补码还原就需要符号位不变,剩下的取反 + 1,得到 10000111,这个值打印出来就是 -7。

~就是取反的意思。就是把那个数字的二进制位,原来是0的变为1,原来是1的变为0.而二进制补码表示的数字(现在的计算机几乎都是用的二进制补码来表示的)进行这样的操作就等于取相反数再减一。所以~5就是-5-1=-6.而后面那个~a-b就是~5-3,而~5=-6所以就是-6-3=-9了。
对于二进制补码的数字的操作,如果你是学计算机专业的学生,那么会在计算机基础之类的课程里面学的。如果不是学计算机专业的,知道这个结论就可以了。

1.二进制计数法的概念
人们在日常生活中和生产实践中,我们接触到越来越多的数字,创造了分组计数的制度.而我们的生活中,一般采用了"满十进一"的十进制计数法,
我们现在已经熟悉并经常运用这一种计数法了.但也有采用其他计数法.如二进制,六进制,十六进制等计数法.现在就来讲一讲"二进制"和"十进制"的关系
2.十进制和二进制数的互化
(1)化十进制数为二进制数
<1>比较小的十进制数为二进制数可以用观察法.
例:化45为二进制数
因为2的0次方,1次方,2次方~~~10次方分别等于1,2,4,8,16,32,64,128,256,512,1024.
所以 45=32+8+4+1=2⑤+2③+2②+1=1*2⑤+0*2④+1*2②+0*2①+1*1=101101(二进制)
<2>一般化法
利用短除法(通常叫做"二除取余法")
(2)化二进制数为十进制数
这是比较方便的,只需把二进制是写成展开式;计算即得.

3对于有符号的数
二进制的最高位时符号位:0表示正数,1表示负数
正数的原码,反码,补码都一样
负数的反码=它的原码符号位不变,其它位取反
负数的补码=它的反码+1
0的反码,补码都是0
java中的数都是有符号的

在计算机运算的时候,都是以补码的方式来运算的。

java中有4中位运算,分别是按位与&,按位或|,按位异或^,按位取反。
&:两位全为1,结果为1
|:两位有一个为1,结果为1
^:两位有一个为1,一个为0,结果为1
取反:0取反位1,1取反位0

java中有3个移位运算符
>> 算术右移:低位溢出,符号位不变,并用符号位补溢出的高位
<<算术左移:符号位不变,低位补0
>>>逻辑右移:低位溢出,高位补0

这里可以以8位二进制来表示5 = 000001015取反后 ~5 = 11111010Java中都是有符号正数,所以11111010表示的是一个负数(第一位为1表示负数)把11111010转换为十进制的话,由于负数是用补码来表示的(求补码的方法是取反后加1,从补码转为原码也是取反后加1)。把后面七位补码求源码,得到的是 000 0110,所以,这里表示是6,再加上符号位就是-6了。(这个计算换成32位二进制也是一样的道理)~a - b = (~a)-b = (-6)-3 = -9了


夏津县17750116152: java 中的 ~ 取补码的详细意思是什么 ?
林饺硫酸: 这里可以以8位二进制来表示 5 = 00000101 5取反后 ~5 = 11111010 Java中都是有符号正数,所以11111010表示的是一个负数(第一位为1表示负数) 把11111010转换为十进制的话,由于负数是用补码来表示的(求补码的方法是取反后加1,从补码转为原码也是取反后加1).把后面七位补码求源码,得到的是 000 0110,所以,这里表示是6,再加上符号位就是-6了. (这个计算换成32位二进制也是一样的道理) ~a - b = (~a)-b = (-6)-3 = -9了

夏津县17750116152: 百思不得其解:java中的符号 ~取补码问题 -
林饺硫酸: 在 Java 中 ~ 表示取反,例如 n=6,在内存中是 00000110,~n 就是取反操作得到 11111001,因为符号位是 1 表示是个负数,在 Java 中负数是用补码来保存的,因此 11111001 是一个补码,要将补码还原就需要符号位不变,剩下的取反 + 1,得到 10000111,这个值打印出来就是 -7.

夏津县17750116152: JAVA中对一个数进行取反操作到底是怎么计算的(包括正数和负数),负数的原码到底如何表示. -
林饺硫酸:[答案] 先取得数的反码 然后按位取反 此时得到的是补码(因为在JAVA中是使用补码来表示二进制数据的) 再变为原码就行了 负数的原码就是1XXXXX 第一位是符号位 后面是数值位

夏津县17750116152: 一元运算符中的~取补码有什么作用java -
林饺硫酸: ~ (位运算符),按位非,其运算法则为:如果某个数对应位上是1,则该位上最后得到的结果就是0;反之,如果某个数对应位上是0,则该位上最后得到的结果就是1.也就是有些人说的取反...

夏津县17750116152: java求补码 -
林饺硫酸: ~在zhidaoc和java语言中都是求反码,或者叫位非NOT运算.java的运算有特殊性:4的二进制为100,执行~4后转换成32位有符号整型(int),值为11111111111111111111111111111011 打印时,按有符号解释成-5.内 C语言的运算和java大...

夏津县17750116152: java新手.1、正数的机器数是原码,负数的机器数是补码?什么意思?? -
林饺硫酸: 反码是将其2进制数每一位按位取反.即1改为0,0改为1.补码则不同.正数的补码是其源码本身 负数的补码是其除符号位以外其他每一位按位取反再加一,符号位不变.例如:10进制数11:源码:00001011;反码:11110100;补码:00001011;十进制数-11:源码:10001011;反码:01110100;补码:11110101;

夏津县17750116152: Java中,byte b=3; b=(byte)(b+200); 输出 b为什么是 —53 ? -
林饺硫酸: 首先都知道:byte类型的范围是-128到127.b+200=203超过范围了,java中就得用补码进行存储.所谓补码,就是符号位不变,其余位取反,最后+1.符号位指的是二进制中的第一位,比如1100 0011中,第一个1就是符号位.(1表示负数,0表示整数)203的二进制位:1100 1011 取补码: 1011 0100=52(注意符号位不参与运算) ,结果+1=53.又因为符号位是1,所以是-53

夏津县17750116152: java中 - 5的反码是怎么计算的 补码呢 -
林饺硫酸: 先转换成二进制,就清晰了 11111011 逐位取位就是反码 补码就是和 & 0xff ~~~~~~~~~~~~~~~~~~~~~~~~~~~~

夏津县17750116152: java 中 int x=1;~x是多少呢,怎计算出来的呢? -
林饺硫酸: 结果是-2.1、~是非运算,二进制位0变1,1变0.2、x的值是1,表示的二进制位是 (24个0) 0000 0001,~x后是(24个1) 1111 1110,此时为补码,补码换算成源码是取反+1,符号位不变,也就是1(23个0) 0000 0001,再加1就是1(23个0) 0000 0010,就是-2.

夏津县17750116152: java中Byte的定义 -
林饺硫酸: signed 是有符号位,即最高位是符号位, two's complement是特有名词,翻译过来是 补码 整句意思就是byte保存8位有符合的补码表示的整数.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网