原码、补码、反码,及其在JAVA中的应用

1、原码表示法

十进制:            +25                -25

二进制原码:     01101             111001

用附加的符号位表示数的正负,符号位加在绝对值最高位之前(最左侧)。通常用“0”表示正数,“1”表示负数。

2、反码表示法

十进制数:                +6                   -6

二进制原码:            0110                1110

二进制反码:            0110                1001

与原码表示法不同的是数值部分,即正数的反码数值与原码数值相同,负数的反码数值是原码数值按位求反

3、补码表示法

十进制数:                   +6                    -6

二进制原码:                0110                1110

二进制反码:                0110                1001

二进制补码:                0110                1001+1=1010

在补码表示法中,正数的补码和原码以及反码的表示相同。但对于负数,有原码转换到补码的规则为:符号位保持不变,数值部分则是按位求反,任何加1,。


4、在计算机中的数字运算是以补码形式进行的。所以在做位运算时,首先要将数字转换为补码形式。

5、java有7种位运算符:与(&),或(|),异或(^),取反(~),左移(<<),有符号右移(>>),无符号右移(>>>)。

这7种位运算符,运算时,符号位都要参与运算。

有了上面3种规则,java位运算就很简单了,

例子1:与(&)

int a=127;

int b=-2;

int c=a&b;

System.out.println(c);

 打出来的是126


运算过程:

先求补码,

127的补码是

00000000 00000000 00000000 01111111,

-2的补码是

11111111 11111111 11111111 11111110

所以a&b的结果是

00000000 00000000 00000000 01111110

这个数仍旧是补码,要求它的原码,很简单,它是正数,原码就是本身,即126。

 

例子2:取反(~)

int a=Integer.MAX_VALUE;

int b=~a;

System.out.println(b);

 打出来的是    -2147483648

 运算过程:

a是int中最大的正数,所以a的补码是

01111111 11111111 11111111 11111111

取反后的补码是

10000000 00000000 00000000 00000000

这是个特殊补码,即int中最小的负数,-2147483648。

 

System.out.println(Integer.MIN_VALUE);

System.out.println(Integer.MAX_VALUE);

打印看看

-2147483648

2147483647

 

例子3:左移(<<)

 int a=1;

int b=a<<31;

System.out.println(b);

打印出来的是  -2147483648

 

运算过程:

1的补码是

00000000 00000000 00000000 00000001

左移31位后

10000000 00000000 00000000 00000000

这个很眼熟了吧,int中最小的负数,所以是-2147483648。




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值