我正在搞乱汇编语言编程,我很好奇如何使用逻辑运算符 AND 判断一个数字是否是 4 的倍数?
我知道如何使用“div”或“remainder”指令来做到这一点,但我试图通过数字/单词的位操作来做到这一点。
谁能指出我正确的方向?我正在使用 MIP,但与语言无关的答案很好。
我正在搞乱汇编语言编程,我很好奇如何使用逻辑运算符 AND 判断一个数字是否是 4 的倍数?
我知道如何使用“div”或“remainder”指令来做到这一点,但我试图通过数字/单词的位操作来做到这一点。
谁能指出我正确的方向?我正在使用 MIP,但与语言无关的答案很好。
好吧,要检测一个数字是否是另一个数字的倍数,您只需要做x MOD y
. 如果结果是0
,那么它是偶数。
这也是真的,对于每y
一个是 的幂2
,(x MOD y)
都等于(x AND (y - 1))
。
所以:
IF (x AND 3) == 0 THEN
/* multiple of 4 */
编辑:
好的,你想知道为什么 (x MOD y) == (x AND (y - 1))
什么时候y
是 2 的幂。我会尽力解释。
基本上,如果一个数字是 2 的幂,那么它只有一个位集(因为二进制是以 2 为底的)。这意味着所有低位都未设置。例如:16 == 10000b, 8 == 1000b
等。
如果从这些值中减去 1。您最终会设置未设置的位,并设置其下方的所有位。
15 = 01111b, 7 = 0111b
等。所以基本上它是创建一个掩码,可用于测试是否设置了任何低位。我希望这很清楚。
编辑: Bastien Léonard 的评论也很好地涵盖了它:
如果将(无符号)除以 4,则向右移动两位。因此,剩下的就是这两个位,当你除法时它们会丢失。4 - 1 = 11b,即一个掩码,当您将其与一个值进行“与”运算时会产生最右边的两个位。
编辑:请参阅此页面以获得更清晰的解释:http ://en.wikipedia.org/wiki/Power_of_two#Fast_algorithm_to_check_if_a_positive_number_is_a_power_of_two 。
它涵盖了检测 2 的幂以及使用 AND 作为快速模运算(如果它是 2 的幂)。
(x & 3) == 0
Wrt 汇编语言,如果可用则使用 TST,否则使用 AND,并检查零标志。
在 x86 程序集中:
test eax, 3
jnz not_multiple_of_4
; action to be taken if EAX is a multiple of 4
not_multiple_of_4:
; ...
如果一个数字的低 2 位为 0,则该数字是 4 的倍数,因此您可以简单地将数字右移两次并检查移位的位是否为 0。