查看下JDK的Collection接口,本来准备接着研究Map接口,可是一查看HashMap类,到处是位运算实现。初始化都使用的是位置运算,真是高大上。
楼上的大神,只是想要声明 MAXIMUM_CAPACITY =’1 073 741 824’;
Java位运算是针对于整型数据类型的二进制进行的移位操作。主要包括位与、位或、位非,有符号左移、有符号右移,无符号右移等等。
不存在无符号左移<<<运算符
Java整型数据类型有:byte、char、short、int、long。
一个字符8个字节
数据类型 所占位数
byte 8
boolean 8
short 16
int 32
long 64
float 32
double 64
char 16
计算机表示数字正负不是用+ -加减号来表示,而是用最高位数字来表示,0表示正,1表示负
所以比如-4用二进制原码表示就是1111 1111 1111 1111 1111 1111 1111 1100
下面根据实例一个一个的来说明各种位运算的运算规则:
位与&(真真为真 真假为假 假假为假)
4&6
0000 0000 0000 0000 0000 0000 0000 0100
0000 0000 0000 0000 0000 0000 0000 0110
0000 0000 0000 0000 0000 0000 0000 0100
结果:4
位或|(真真为真 真假为真 假假为假)
4|6
0000 0000 0000 0000 0000 0000 0000 0100
0000 0000 0000 0000 0000 0000 0000 0110
0000 0000 0000 0000 0000 0000 0000 0110
结果:6
位非~(取反码)【注:Java中正数的最高位为0,负数最高位为1,即最高位决定正负符号】
~4
0000 0000 0000 0000 0000 0000 0000 0100
1111 1111 1111 1111 1111 1111 1111 1011
解码:先取反码,再补码
0000 0000 0000 0000 0000 0000 0000 0100
0000 0000 0000 0000 0000 0000 0000 0101
结果:-5
位异或^(真真为假 真假为真 假假为假)
4^6
0000 0000 0000 0000 0000 0000 0000 0100
0000 0000 0000 0000 0000 0000 0000 0110
0000 0000 0000 0000 0000 0000 0000 0010
结果:2
有符号右移>>(若正数,高位补0,负数,高位补1)
-4>>2
1111 1111 1111 1111 1111 1111 1111 1100 原码
1111 1111 1111 1111 1111 1111 1111 1111 右移,最左边空出两位按规则负数空位补1
0000 0000 0000 0000 0000 0000 0000 0000 解码
0000 0000 0000 0000 0000 0000 0000 0001 补码(补码即最后一位+1)
结果:-1
有符号左移<<(若正数,高位补0,负数,高位补1)
-4<<2
1111 1111 1111 1111 1111 1111 1111 1100 原码
1111 1111 1111 1111 1111 1111 1111 0000 左移,最右边空出两位补0
0000 0000 0000 0000 0000 0000 0000 1111 解码
0000 0000 0000 0000 0000 0000 0001 0000 补码
结果:-16
无符号右移>>>(不论正负,高位均补0)
-4>>>2
1111 1111 1111 1111 1111 1111 1111 1100 原码
0011 1111 1111 1111 1111 1111 1111 1111 右移(由于高位均补0,故>>>后的结果一定是正数)
结果:1073741823
由于数据类型所占字节是有限的,而位移的大小却可以任意大小,所以可能存在位移后超过了该数据类型的表示范围,于是有了这样的规定:
如果为int数据类型,且位移位数大于32位,则首先把位移位数对32取模,不然位移超过总位数没意义的。所以4>>32与4>>0是等价的。
如果为long类型,且位移位数大于64位,则首先把位移位数对64取模,若没超过64位则不用对位数取模。
如果为byte、char、short,则会首先将他们扩充到32位,然后的规则就按照int类型来处理。
学到这里,我想你也可能会问,位运算到底有什么用途或者有哪些场景可以应用到它。因为位运算的运算效率比直接对数字进行加减乘除高很多,所以当出现以下情景且对运算效率要求较高时,可以考虑使用位运算。不过实际工作中,很少用到它,我也不知道为什么很少有人用它,我想应该是它比较晦涩难懂,如果用它来进行一些运算,估计编写的代码的可读性会不强,毕竟我们写的代码不仅仅留给自己一个人看。
感谢原著者,引用来自:
http://www.52ij.com/jishu/102.html