java中的编码,按位操作符,移位运算符

java中的编码

Java只存储补码

原码:二进制,最高位为符号位,0为正数,1为负数

反码:正数不变;负数符号位不变,原码数值取反

补码:正数不变;负数反码+1

移码:符号位取反

整数-3的二进制:

原码为 10000000 00000000 00000000 00000011

反码为 11111111 11111111 11111111 11111100

补码为 11111111 11111111 11111111 11111101

按位操作符

1、~按位非:按位取反。

~4的补码:

00000000 00000000 00000000 00000100,逐位取反后得到:

11111111 11111111 11111111 11111011,转为原码即为-5.

2、|按位或:逐位进行逻辑或运算,例如:1|0=1,0|0=0,1|1=1,0|1=1

4|-5

4 二进制形式为:00000000 00000000 00000000 00000100,

-5二进制形式为:11111111 11111111 11111111 11111011,

逐位逻辑或运算:11111111 11111111 11111111 11111111,转为原码即为-1.

3、&按位与:逐位进行逻辑与 运算,原理:1|0=0,0|0=0,1&1=1;0&1=0等。

4&-5

​ 4 的二进制形式为:00000000 00000000 00000000 00000100,

​ -5的二进制形式为:11111111 11111111 11111111 11111011,

逐位进行逻辑与运算:00000000 00000000 00000000 00000000,即得到0.

实际应用:

可以把字节转换为整 数,-64&0xFF=192

也可以用八进制的形式,-64&0377=192

其实0xFF和0377都表示的是整数255

4、^按位异或:逐位进行逻辑异或运算,原理:11=0,10=1,01=1,00=0.
4^-5
4的二进制形式为:00000000 00000000 00000000 00000100,
-5的二进制形式为:11111111 11111111 11111111 11111011,
逐位进行逻辑异或运算:11111111 11111111 11111111 11111111,即得到-1.

实际应用:按位异或可以比较两个数字是否相等,它利用 1^1 =0,0^0 =0的原理。 20^20==0

移位运算符

<<:左移,丢弃最高位,0补最低位

>>:右移,符号位不变,左边补上符号位

>>>:无符号右移,0补最高位

例子:

整数-3的二进制
原码为 10000000 00000000 00000000 00000011
反码为 11111111 11111111 11111111 11111100
补码为 11111111 11111111 11111111 11111101
Java存储的整数-3实际为补码

1、左移3位 -3<<3
11111111 11111111 11111111 11111101 左移3位后为:
11111111 11111111 11111111 11101000 转为原码:
10000000 00000000 00000000 00011000 转为整数:即-24

2、右移3位 -3>>3 ,
11111111 11111111 11111111 11111101右移3位后:
11111111 11111111 11111111 11111111 转为原码:
10000000 00000000 00000000 00000001 转为整数:即为-1

3、无符号右移3位, -3>>>3

11111111 11111111 11111111 11111101 无符号右移3位为
00011111 11111111 11111111 11111111
由于无符号右移之后为正数,正数的补码和原码是一致的,所以 -3>>>3的值即为:
00011111 11111111 11111111 11111111

转成整数输出为:0*2^31+0*2^30+0*2^29+1*2^28+1*2^27+.....+1*2^1+1*2^0=536870911

PS:
对char,byte或者short进行移位处理,那么在移位进行之前,它们会自动转换成一个int。只有右侧的低5位(32)才会有用。这样可防止我们在一个int数里移动不切实际的位数。若对一个long值进行处理,最后得到的结果也是long。此时只会用到右侧的6个低位(64),防止移动超过long值里现成的位数。

byte(1字节)、short(2字节)、char(2字节)做移位运算之前,会被自动转换为int类型,然后再进行运算。
byte(1字节)、short(2字节)、char(2字节)类型的数据经过移位运算后结果都为int型。
long(8字节)经过移位运算后结果为long型。
在左移位(<<)运算时,如果要移位的位数大于被操作数对应数据类型所能表示的最大位数,那么先将要求移位数对该类型所能表示的最大位数求余后,再将被操作数移位所得余数对应的数值,效果不变。
比如1<<35 = 1<<(35%32) = 1<<3 = 8

对于有符号右移位(>>)运算和无符号右移位(>>>)运算,当要移位的位数大于被操作数对应数据类型所能表示的最大位数时,那么先将要求移位数对该类型所能表示的最大位数求余后,再将被操作数移位所得余数对应的数值,效果不变。
比如100>>35 = 100>>(35%32) = 100>>3 = 12

float(4字节)移位没有实用意义,因为浮点数的位数有好几种不同含义(一般根据IEEE754标准)
符号位(1位)+ 指数位(8位)+ 尾数(23位)= 32位

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值