按位AND作为模数替代

时间:2014-11-07 21:02:42

标签: ruby

我想知道为什么以下表达式会产生相同的结果:

# method 1
def produce(n)
  n % 16
end

#method 2
def produce(n)
  n & 15
end

我知道方法1使用模运算,方法2使用'按位AND'。但我有点迷失为什么用&调用15与调用模16进行调用相同。

我预感到它仅适用于modulo x x 2^n的{​​{1}}。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

你认为这与模2^n有关是正确的。让我们来看看二进制文件是如何分解的。

使用模16的第一种方法在二进制文件中看起来像这样:

10000

通过与按位和15:

的共同比较
01111

本质上你用模数或余数做的是得到潜水时剩下的16点。因为它是2的幂,你实际上是去除16以上的所有位,因为它们均匀分配并留下任何比特低于16。

使用bitwise,你也在做同样的事情。你将每一点都保持在16以下并给自己相同的结果。

这适用于任何数字% 2^n& (2^n - 1)