java 取反 值_java编程 按位取反的问题 java中取反操作是正数

这个问题涉及到计算机内部的编码。

对于整数,计算机内部用最高位表示符号位,0表示为正,1表示为负。

对于负数,为了便于计算,计算机用补码来表示其值。

已经一个数的补码,要知道其值分两种情况:

1:符号位是0,正数,所以后面的二进制位则表示大小,即正数的原码=其补码。如1表示出来则为00000001(我这里用八位来表示,也可以用16位或32位)

2:符号位是1,负数,这时候需要把后面的数取反再加一(要问为什么?查一下资料吧,可以根据补码的特性推出来),所以11111110表示的数是1111110取反为0000001,再加1,则为0000002。算上符号位,就是-2。

以你的例子来说,

a=0=0000 0000 0000 0000 0000 0000 0000 0000~a = 1111 1111 1111 1111 1111 1111 1111 1111符号位是1,后面的数取反再+1

1000 0000 0000 0000 0000 0000 0000 0001 = -1

首先,long是64位,8字节

计算机中存储时高位补0,你取反后高位全部为1,所以是负值。

注意0xFFFFFFFF在Java中被认为是整形常量,所以他会被默认为int类型,32位的,在和long类型进行AND操作时,它会按照最高位(此时为1)进行扩展,即它被机器解释成0xFFFFFFFF FFFFFFFF,这样以来,你的temp等于没有变化。

要想改变上面那种情况,你可以这样写Ox7FFFFFFF,这时最高位为0,被机器解释成0x00000000 7FFFFFFF,AND操作会让temp变成正

不过以上解决方法并不能达到你想要达到的效果,你想要的结果是不是:

只把temp的有效位进行取反,高位不变?

无符号的32bit整型最大值的二进制编码 和 有符号32bit二补码编码整型的-1的二进制编码

是一样的..,就是说有不少前提。

Java的int是有符号的,只有int被当成无符号的时候,比如转成long的低32bit,

这时32bit最大值和和int的-1的二进制编码一样。

在2进制中,负数是以它正值的补码形式表达

原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。

比如 0000 0000 0000 0000 0000 0000 0000 0101是 5的 原码。

反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。

取反操作指:原为1,得0;原为0,得1。(1变0; 0变1)

比如:将5的二进制表达式的每一位取反,得

1111 1111 1111 1111 1111 1111 1111 1010

称:1111 1111 1111 1111 1111 1111 1111 1010 是 0000 0000 0000 0000 0000 0000 0000 0101 的反码。

反码是相互的,所以也可称:

1111 1111 1111 1111 1111 1111 1111 1010 和 0000 0000 0000 0000 0000 0000 0000 0101 互为反码。

补码:反码加1称为补码。

也就是说,要得到一个数的补码,先得到反码,然后将反码加上1,所得数称为补码。

那么,5的补码为:

1111 1111 1111 1111 1111 1111 1111 1010 + 1 =

1111 1111 1111 1111 1111 1111 1111 1011

所以,-5 在计算机中的二进制表达为:

1111 1111 1111 1111 1111 1111 1111 1011

转换为十六进制:0xFFFFFFFB。

====================================

明白了上面的就可以理解怎么求 ~i 了

int型储存32个二进制位,~这个符号是按位取反,就是求i的反码。

即得到1111 1111 1111 1111 1111 1111 1111 1010

上面这串二进制代表一个负数,将它转换成int型过程如下:

1111 1111 1111 1111 1111 1111 1111 1010-1 =

1111 1111 1111 1111 1111 1111 1111 1001

再求反:

0000 0000 0000 0000 0000 0000 0000 0110

这个值就是5的按位取反所得到的int整数的绝对值(注意:5按位取反得到的是负数)

所以转换为int型为:6

即:int型的i=5 取反后的结果为-6

首先要明确,取反是二进制操作

下面以5为例:

二进制原码:0000 0000 0000 0000 0000 0000 0000 0101

取反操作后:1111 1111 1111 1111 1111 1111 1111 1010

而在Java中,有符号整数都是用补码来表示,而补码=反码+1

1.先求反码:1000 0000 0000 0000 0000 0000 0000 0101

2.再求补码:1000 0000 0000 0000 0000 0000 0000 0110

最高位代表符号位 1 表示负数,0 表示正数 所以结果是-6

java编程 按位取反的问题

: 1. 这个问题涉及到计算机内部的编码. 对于整数,计算机内部用最高位表示符号位,0表示为正,1表示为负. 对于负数,为了便于计算,计算机用补码来表示其值. 已经一个数的补码,要知道其值分两种情况: 1:符号位是0,正数,所以后...

JAVA中的按位取反什么意思 -

: 按位取反 ~ 01101101 10010010 结论:对二进制数按位取反,即0变成1,1变成0.

java中按位取反~解释下运算过程 -

: 按位取反就是每一位都取反,所谓取反就是1变0,0变1 比如楼主说的10 二进制表示就是00000000 00000000 00000000 00001010 取反后就是11111111 11111111 11111111 11110101 这在十进制中就是-11 而他的二进制原码表示就是-1011

Java中按位取反是对操作数求补码的运算吗?

: 补码跟编程语言没关系,补码是一种运算,独立于编程语言和编程环境.所以不管是java还是c,补码都是相同的.补码的运算是按位取反,再加1.只按位取反,叫反码,一般比较少用.

java的按位取反~运算符号是怎么计算的 -

: 首先,你要知道java中的int是32位的 其次,正数以原码的形式存储,负数以补码的形式存储12的二进制是0000 0000 0000 0000 0000 0000 0000 1100 取反后得1111 1111 1111 1111 1111 1111 1111 0011 java中都是有符号数,首位是1,所以是负数,负数也就是补码,也就是说1111 1111 1111 1111 1111 1111 1111 0011是补码 补码,反码加1后得源码 转换成源码得0000 0000 0000 0000 0000 0000 0000 1101 这个数是13,加上符号就是-13

java的按位取反"~"运算符号是怎么计算的

: 得看你的数据类型了,比如说你写12,默认的就是int的12int是32位的 12=00000000 00000000 00000000 00001100~12=11111111 11111111 11111111 11110011第二个问题,有符号整数是按照最高位判断正负的(java中的数值除了char都是有符号的,都符合这个规则),如果x最高位是1,那么该数是负数,其值为 -((~x)+1),因此11111111 11111111 11111111 11111111作为int型的话,因为最高位为1,所以其值为 -(0+1)=-1根据上面的理论,~12=-(~(~12)+1)=-13

JAVA中“~”按位取反运算符的一些问题.

: 首先你要知道现在我们用的多数都是32位机,所以整形数都是4个字节那么再看看按位取反的结果:00000000 00000000 00000000 00000101 这是500000000 00000000 00000000 00000000 这是011111111 11111111 11111111 11111111 这...

java中按位取反 ~4=5 怎么算的 求具体步骤 -

: 正数的补码为0100 然后取反 1011,我们知道反码+1=补码,反码就为补码-1,也就是1010,然后取反0101,值已经出来了为5,符号位看补码,补码最高位为0代表正数,最高位为1代表负数,所以答案应该是-5,而不是5(值多少看原码,符号位看补码)

java中按位取反 ~5= - 6为什么呀? -

: 这是因为整数在计算机中是二进制存储的.java中 ~5=-6 ,而这个-6是输出到屏幕上,我们看到的是-6.首先看对5求反,5的二进制原码是:0000 0101,取反之后是:1111 1010 ,得到的这个值在计算机中的存储原型也是 1111 1010,而要把...

java中按位取反 ~5= - 6是为什么? -

: 首先要明确,取反是二进制操作 下面以5为例:二进制原码:0000 0000 0000 0000 0000 0000 0000 0101 取反操作后:1111 1111 1111 1111 1111 1111 1111 1010 而在java中,有符号整数都是用补码来表示,而补码=反码+11.先求反码:1000 0000 0000 0000 0000 0000 0000 01012.再求补码:1000 0000 0000 0000 0000 0000 0000 0110 最高位代表符号位 1 表示负数,0 表示正数 所以结果是-6

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值