8

我正在搞乱汇编语言编程,我很好奇如何使用逻辑运算符 AND 判断一个数字是否是 4 的倍数?

我知道如何使用“div”或“remainder”指令来做到这一点,但我试图通过数字/单词的位操作来做到这一点。

谁能指出我正确的方向?我正在使用 MIP,但与语言无关的答案很好。

4

4 回答 4

24

好吧,要检测一个数字是否是另一个数字的倍数,您只需要做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 的幂)。

于 2009-04-14T17:49:53.537 回答
5

(x & 3) == 0

Wrt 汇编语言,如果可用则使用 TST,否则使用 AND,并检查零标志。

于 2009-04-14T17:52:11.457 回答
3

在 x86 程序集中:

    test eax, 3
    jnz not_multiple_of_4

    ; action to be taken if EAX is a multiple of 4

not_multiple_of_4:
    ; ...
于 2009-04-14T18:01:20.123 回答
1

如果一个数字的低 2 位为 0,则该数字是 4 的倍数,因此您可以简单地将数字右移两次并检查移位的位是否为 0。

于 2009-04-14T17:52:27.523 回答