首页   快速返回

java位运算     所属分类 java
整数 有符号 无符号
整数在计算机内部的表示

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 实现要点