使用位运算优化对2的n次方取模

7 阅读1分钟

使用位运算优化对2的n次方取模

hash % 2^n == hash & (2^n - 1)

原理分析

2^n - 1

2^n:

二进制形式为1+n个0

2^n - 1:

二进制形式为n个1

hash % 2^n

例如我们对27取模2^3,先将13写成2进制形式:

27 =1 x 2^4 + 1 x 2^3 
                     + 
                      0 x 2^2 + 1 x 2^1 + 1 x 2^0 

我将“x % y”理解为:

从x中不停的扣掉y值,直到剩下0或者剩下的值小于y。

对27来执行这个过程:

  • 先将"1 x 2^4 + 1 x 2^3"这坨扣掉
  • 剩下的0 x 2^2 + 1 x 2^1 + 1 x 2^0 < 2^3

观察身下的部分可以发现,27 % 2^3相当于 截取 27二进制的后3位。

一般的,hash % 2^n相当于 截取 hash二进制表示的后n位。

hash & (2^n - 1)

由前面分析可知,2^n - 1二进制为n个1,用它和hash进行&运算刚好可以截取后n位。所以:

hash % 2^n == hash & (2^n - 1)

位运算只需要一个时钟周期;而%运算需要几十个。所以使用位运算实现更快。

其他

n位2进制中有2^n个数。

重复排列公式

如果有 n 种位置,每个位置都有 k 种选择,且允许重复选择,那么:

能表达的编码数量 = k ^ n

均匀分布/不均匀分布

假设有n个桶:

  • “均匀分布”指每个桶都有相同概率被选中
  • “不均匀分布”指每个桶被选中的概率不同;甚至在概率不同的同时,有的桶被选中的概率为0%