HashMap(一)——(n - 1) & hash

博客探讨了HashMap中计算存储位置时使用(n-1)&hash而非hash%n的原因。文章指出,由于n是2的幂,n-1会形成一个全1的二进制数,这样通过位运算可以高效地获取hash值的后几位,即余数。这种方法比使用取模运算更快速,且适用于计算机底层的逻辑运算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

理解 (n - 1) & hash

HashMap中存值的时候需要计算位置,具体的算法为 (n - 1) & hash
为什么不使用 hash % n
我们来简单理解一下
n是map的容量,等于2 的幂
例如:

100 / 8 = 12
100 % 8 = 4
如果使用二进制的位运算的话,除以8[2 ^ 3]就是向右移了3位
0110 0100 >> 3 = 0000 1100[100]
0000 1100 = 12 就是商
100 = 4 就是余数
也就是0110 0100的后3位:100

想一下,hash除以n = 2 ^ m,就是hash值的二进制数向右移动了m位,而余数就是hash的后m

除以8,向右移动3位;除以16,向右移动4位;除以32,向右移动5位 …

那么怎样快捷把这几位表示出来呢
我们首先就想到的是使用 & 符号,有几位余数,我们就使用几个1
例如:

三位余数:100 & 111 = 100
四位余数:1100 & 1111 = 1100
五位余数: 11100 & 11111 = 11100

那么到这里,就解决了一半
但是在计算 hash % n的时候怎么构造这m个1呢

n = 2 ^ m
n是10000的形式
例如:
8 = 1000 = 2 ^ 3
16 = 10000 = 2 ^ 4
32 = 100000 = 2 ^ 5
发现了吗,n表示成2进制的位数是 m + 1
而n - 1刚好就是m位,而且全都是1,完美解决
8 - 1 = 111
16 - 1 = 1111
32 - 1 = 11111

综合看来 hash % n = hash & (n -1)
而后者是使用二进制的逻辑运算,底层运算,效率肯定会高很多

持续更新 -_-

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值