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

目录

二进制中负数怎么表示?

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。

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页

打赏

兰艳稳

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者