Java位运算,负数的二进制表示形式,int类型最大值为什么是2的31次方-1

二进制中负数怎么表示?

在进行位运算之前,先看看负数的二进制形式在计算机中是如何表示的,在计算机中所有的数字都是以二进制补码的形式表示的,其中第一位(最高位)是标志位,为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,可以将1看做是true,0为false,&就为java中的&符号,同为true结果才为true,那么同为1结果才是1。
    例:9 & 8
    二进制形式运算为:
    0000 1001 &
    0000 1000
    二进制结果为:0000 1000,十进制结果即为:8

  2. |(或)
    有一位为1,那么结果为1,同样可以将1看做是true,0为false,|就为java中的|符号,有一个为true结果就为true,那么有一个为1结果就是是1。
    例:9 & 8
    二进制形式运算为:
    0000 1001 |
    0000 1000
    二进制结果为:0000 1001,十进制结果即为:9

  3. ~(非)
    0变为1,1变为0
    例:~9
    9二进制形式为:0000 1001
    | 运算后十进制为:1111 0110
    此为负数,那么它的原码为补码-1,然后除符号位外,所有取反
    原码为:1000 1010
    十进制则为:-10

  4. ^(异或)
    两位不相同,结果为1
    例:9^8
    二进制形式运算为:
    0000 1001 ^
    0000 1000
    二进制结果为:0000 001
    十进制结果即为:1

移位运算

  1. << (左移)
    各二进制位全部左移N位,高位丢弃,低位补0
    例:9<<2
    9的二进制形式为:0000 1001
    左移两位后:0010 0100
    十进制则为:36

  2. (右移) > >
    各二进制位全部右移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

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页