为什么(x& 3)与(x mod 4)相同?

时间:2011-10-24 13:29:16

标签: math operators bitwise-operators

我找到了一些示例源代码,其中作者似乎使用按位&运算符而不是%运算符。但是,当我尝试x & 4时,它不会产生与x % 5相同的值。

2 个答案:

答案 0 :(得分:16)

这仅适用于2的权力。

一般来说:

x MOD 2^n

相当于:

x AND (2^n - 1)

另请注意,这仅适用于x >= 0,具体取决于您对MOD x < 0的定义。


要理解为什么这是有效的,请考虑MOD究竟是什么 - 它只是执行整数除法后的余数。在除以2 ^ n的情况下,我们实际上只是将二进制值右移n位并丢弃任何被移出的低阶位,例如,对于8位二进制数

a b c d e f g h

如果我们除以4 = 2 ^ 2,那么我们右移2位:

0 0 a b c d e f

由于整数除法,余数(g h)已被丢弃。

如果我们想知道余数,那么我们可以通过应用g h的掩码来提取位0 0 0 0 0 0 1 1

    a b c d e f g h
AND 0 0 0 0 0 0 1 1
  = 0 0 0 0 0 0 g h

请注意,has的值为3,在一般情况下只有2 ^ n - 1。

让我们尝试一些实数。假设我们想要计算42/4并得到商和余数:

42 = 0 0 1 0 1 0 1 0

为了得到商,我们向右移2位:

  42 / 4 (decimal)
= 0 0 1 0 1 0 1 0 >> 2
= 0 0 0 0 1 0 1 0
= 10 (decimal)

  42 MOD 4 (decimal)
= 0 0 1 0 1 0 1 0 AND 0 0 0 0 0 0 1 1
= 0 0 0 0 0 0 1 0
= 2 (decimal)

所以42/4 = 10余数2.

答案 1 :(得分:4)

答案很简单,试着用二进制思考。

0000 = 0 AND 11 = 0000 = 0
0001 = 1 AND 11 = 0001 = 1
0010 = 2 AND 11 = 0010 = 2
0011 = 3 AND 11 = 0011 = 3
0100 = 4 AND 11 = 0000 = 0
0101 = 5 AND 11 = 0001 = 1
0110 = 6 AND 11 = 0010 = 2
0111 = 7 AND 11 = 0011 = 3

......等等。

这与提醒具有相同的结果(%是余数,正式,不是模数)。 它仅适用于2的幂,仅适用于零和正数。