(n - 1) & hash =hash % n 的本质

(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次幂]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值