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位