(n - 1) & hash = hash % n [n是2的m次幂]
1. 先说 “十进制的余数”
举例: 234%10=4 143453%100=53
十进制余数可以发现规律: 被除数是10的n次幂时,只要取除数的最后n位 ,就是 余数了
为什么可以这么做呢?
*因为最后n位之前的数都可以被[10的n次幂]整除 所以最后的n位就是余数*
2. 再说 “什么是位移"和"二进制倍数”
举例 :010101 [十进制=21]
位移:
左位移:
010101 << 1 --> 101010 [十进制=42] 等于乘以 2 [左位移1位]
010101 << 2 --> 1010100 [十进制=84] 等于乘以 4 [左位移2位]
即 左位移 n位 就是 乘以 2的n次幂
参考"十进制的余数"得出的结论 可以得出 以下结论
二进制最后n位之前的数都可以被[2的n次幂]整除 所以最后的n位就是余数
3 结论再解释
假设一个数是 0110101 那么他可以
通过 011010 左移1位 然后加 1得到 [011010 乘以2(2^1) + 1]
或 通过 01101左移2位 然后加 1 得 [01101 乘以4 (2^2) + 1]
或 通过 0110左移3位 然后加 101 得到[ 0110乘以8 (2^3) + 101 ]
,,,,,
依次类推
即 011010 * 01101** 0110***
+ 1 + 01 + 101
----------- ---------- --------
0110101 0110101 0110101
而想获得 二进制的最后 n位置 [余数]
只要 让这个二进制&一个前面位置都是 0 ,最后n位置都是1的二进制 就可以了
即 010100101
& 000000111
最后n位置都是1 和倍数的关系 是 倍数-1= 2^n-1= 二进制的n个1
所以 hash &(倍数-1)=余数 [倍数是2的n次幂]