我找到了一些示例源代码,其中作者似乎使用按位&
运算符而不是%
运算符。但是,当我尝试x & 4
时,它不会产生与x % 5
相同的值。
答案 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的幂,仅适用于零和正数。