java位运算  
   
所属分类 java
浏览量 1770
整数 有符号 无符号
整数在计算机内部的表示
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 实现要点