java位运算
所属分类 java
浏览量 1290
整数 有符号 无符号
整数在计算机内部的表示
8位带符号整数范围 -128 ~ 127
二进制表示 最高位为符号位 , 0正 1负
为了计算方便,及简化CPU结构,存储和运算时采用补码
原码有+0和-0的区分,0000 0000 1000 0000
如果考虑符号位参与运算,那么在设计CPU的时候会复杂很多
原码 反码 补码
正数的原码、反码和补码都是自身
以8位为例
-8的原码是 10001000,最高位的1代表负数,后续的7位代表数值
负数的反码 指符号位不变,其他的位取反,也就是0变1,1变0
-8的反码是 11110111
负数的补码是指在反码的数值位上加1,只计算数值位,不改变符号位。
-8的补码是 11111000
8
源码 00001000
反码 00001000
补码 00001000
-8
源码 10001000
反码 11110111
补码 11111000
对负数的补码再求补,则得到的负数的原码。
位运算
与 或 非 亦或 移位
&|~^) >> << >>>
优先级
~
<< >> >>>
&
^
|
左移位运算符(<<)向左移动指定的位数(低位补0)
“有符号”右移位运算符(>>)向右移动指定的位数, 使用“符号扩展”, 若值为正,则在高位插入0;若值为负,则在高位插入1。
“无符号”右移位运算符(>>>),使用“零扩展”:无论正负,高位插入0。这一运算符是C/C++没有的。
右移一位相当于除以2,左移一位(在不溢出的情况下)相当于乘以2;移位运算速度高于乘除运算
Object public native int hashCode();
hashmap中hash函数
java7
final int hash(Object k) {
int h = hashSeed;
if (0 != h && k instanceof String) {
return sun.misc.Hashing.stringHash32((String) k);
}
h ^= k.hashCode();
// This function ensures that hashCodes that differ only by
// constant multiples at each bit position have a bounded
// number of collisions (approximately 8 at default load factor).
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
java8
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
java7中 有 hashSeed , java8中没有
上一篇
下一篇
常用hash算法及冲突解决方法
java8 hashmap 要点
hashmap在java7和8中的区别
HashMap和ConcurrentHashMap中的hash函数
ConcurrentHashMap读不需要加锁的秘密
ConcurrentHashMap size 实现要点