目录
二进制中负数怎么表示?
Java位运算
按位运算
移位运算
int类型的取值范围是多少?
二进制中负数怎么表示?
在进行位运算之前,先看看负数的二进制形式在计算机中是如何表示的,在计算机中所有的数字都是以二进制补码的形式表示的,其中第一位(最高位)是标志位,为0表示正数,为1表示负数,剩余的位才是用来表示数字部分的。使用补码,可以将符号位和数值域统一处理。同时,加法和减法也可以统一处理。
原码:
正数的原码是按照绝对值大小转换成的二进制数。
负数的原码是按照绝对值大小转换成的二进制数,然后最高位补1表示为负数。
反码:
正数的反码与原码相同。
负数的反码为该数的原码除符号位(即最高位的1)外各位取反。
补码:
正数的补码与原码相同;
负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1.
在java中一个字节(byte)占8位(bit),位(bit)表示二进制中的一个数字的位置,所以8位的意思是二进制数字有8位,以byte类型为正数5的数字举例:
5的原码为:0000 0101
正数的反码、补码都和原码一样,所以byte类型正数5在计算机中的存在形式就是0000 0101。
再看看byte类型负数-5在计算机中怎么表示的:
-5的原码:1000 0101
先求出-5的绝对值的二进制表达式为:0000 0101,再把符号位改为1,原码即为:1000 0101
-5的反码:1111 1010
根据-5的原码1000 0101,除了最高位符号位1不变外,其他的为0则为1,位1则为0,反码即为:1111 1010
-5的补码:1111 1011
根据反码1111 1010,将其+1则得到补码位:1111 1011
所以-5在计算机中二进制形式为:1111 1011。
如果需要根据计算负数的十进制结果为多少,则先根据补码1111 1011减1得到1111 1010,再计算其反码,0转换为1,1转换为0,最高位符号位不变,即结果为:1000 0101,这时可以根据二进制的规则得到值为:-5。
Java位运算
按位运算
&(与)
两位都为1,那么结果为1,可以将1看做是true,0为false,&就为java中的&符号,同为true结果才为true,那么同为1结果才是1。
例:9 & 8
二进制形式运算为:
0000 1001 &
0000 1000
二进制结果为:0000 1000,十进制结果即为:8
|(或)
有一位为1,那么结果为1,同样可以将1看做是true,0为false,|就为java中的|符号,有一个为true结果就为true,那么有一个为1结果就是是1。
例:9 & 8
二进制形式运算为:
0000 1001 |
0000 1000
二进制结果为:0000 1001,十进制结果即为:9
~(非)
0变为1,1变为0
例:~9
9二进制形式为:0000 1001
| 运算后十进制为:1111 0110
此为负数,那么它的原码为补码-1,然后除符号位外,所有取反
原码为:1000 1010
十进制则为:-10
^(异或)
两位不相同,结果为1
例:9^8
二进制形式运算为:
0000 1001 ^
0000 1000
二进制结果为:0000 001
十进制结果即为:1
移位运算
<< (左移)
各二进制位全部左移N位,高位丢弃,低位补0
例:9<<2
9的二进制形式为:0000 1001
左移两位后:0010 0100
十进制则为:36
(右移) > >
各二进制位全部右移N位,若值为正,则在高位插入 0,若值为负,则在高位插入 1
例:9>>2
9的二进制形式为:0000 1001
右移两位后:0000 0010
十进制则为:2
4.(无符号右移) > > >
各二进制位全部右移N位,无论正负,都在高位插入0
例:9>>>2
9的二进制形式为:0000 1001
无符号右移两位后:0000 0010
十进制则为:2
int类型的取值范围是多少?
int类型占4个字节(byte),一个字节(byte)为8位(bit),所以int类型数字的格式如下:
00000000 00000000 00000000 00000000
正数的情况下,最高位必须为0,所以int类型二进制最大能表示的数为:
01111111 11111111 11111111 11111111
那么正数最大数是 231-1,
负数的情况下,最高位必须为1,所以int类型二进制最大能表示的数为:
原码:11111111 11111111 11111111 11111111
补码:1000000 0000000 0000000 0000001
所以这里看起来和正数情况是一样的,最小值为-231+1,那位什么负数是-231呢?
正数0的二进制为:
原码:00000000 00000000 00000000 00000000
负数0的二进制为:
原码:10000000 00000000 00000000 00000000
0的表示形式只需要一种就够了,所以就将负数0拿来表示最小的负数-231。