zoukankan      html  css  js  c++  java
  • HashMap 位运算原理整理

    hash计算公式: h ^ (h >>> 16)

    h 为 Java native 计算得出的hash值,int类型32位

    假如 h 值如下:

    h dec: 2026691355
    h bin: 01111000110011001101101100011011
    

    h 无符号右移(>>>)16位结果:

    bin: 00000000000000000111100011001100
    dec: 30924
    

    hash异或(^)30924 结果:

    01111000110011001101101100011011
    00000000000000000111100011001100
    --------------------------------
    01111000110011001010001111010111
    

    高16位没变,第16跟高16位异或,最终计算得:

    bin: 01111000110011001010001111010111
    dec: 2026677207
    

    计算数组下角标公式:(n - 1) & hash

    n 为数组长度,假如当前长度为 128

    (128 - 1) & 2026677207
    

    128 - 1 结果:

    dec: 127
    bin: 1111111
    

    与运算:

    00000000000000000000000001111111
    01111000110011001010001111010111
    --------------------------------
    00000000000000000000000001010111
    

    结果:

    dec: 87
    bin: 00000000000000000000000001010111
    

    因为数组长度 n 为 2的幂次方,所以所有 n -1 的二进制值为:低位指数m个1高位补零
    比如上方数组长度为128,为2的7次方。 128-1 为 127 用二进制值表示必定为低位7个1高位补零:
    00000000000000000000000001111111

    而任何数与 00000000000000000000000001111111 进行与运算的计算结果必定在 00000000000000000000000001111111 范围内(因为高位都是0低位都是1与其与运算得出的结果高位仍然还是0),所以计算得出的数组下标必定不会超过数组长度(类似与取模运算)。

    扩容两倍:newCap = oldCap << 1

    左移一位就相当于 oldCap * 2

  • 相关阅读:
    AtCoder Regular Contest 061
    Codeforces Round #370 (Div. 2)
    2016 ACM/ICPC Asia Regional Dalian Online
    HDU 5513 Efficient Tree
    Codeforces Round #104 (Div. 1)
    2016 Hunan Province Programming Contest
    2016 Multi-University Training Contest 7
    2016中国大学生程序设计竞赛
    聚会「AHOI 2008」
    游戏「AHOI / HNOI2018」
  • 原文地址:https://www.cnblogs.com/lionsblog/p/14298974.html
Copyright © 2011-2022 走看看