Assembly 仅使用逻辑运算符AND如何判断一个数字是否是四的倍数?

Assembly 仅使用逻辑运算符AND如何判断一个数字是否是四的倍数?,assembly,binary,bit-manipulation,Assembly,Binary,Bit Manipulation,我在搞汇编语言编程,我很好奇如何用逻辑运算符and判断一个数字是4的倍数 我知道如何使用“div”或“余数”指令,但我正试图通过数字/字的位操作来实现这一点 谁能给我指出正确的方向吗?我使用的是MIPs,但语言不可知的答案很好。好吧,要检测一个数字是否是另一个数字的倍数,只需执行x MOD y。如果结果为0,则为偶数倍 同样正确的是,对于每个y是2的幂,(x MOD y)相当于(x和(y-1)) 因此: IF (x AND 3) == 0 THEN /* multiple of 4 */

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

我知道如何使用“div”或“余数”指令,但我正试图通过数字/字的位操作来实现这一点


谁能给我指出正确的方向吗?我使用的是MIPs,但语言不可知的答案很好。

好吧,要检测一个数字是否是另一个数字的倍数,只需执行
x MOD y
。如果结果为
0
,则为偶数倍

同样正确的是,对于每个
y
2
的幂,
(x MOD y)
相当于
(x和(y-1))

因此:

IF (x AND 3) == 0 THEN
    /* multiple of 4 */
编辑:

好的,您想知道当
y
是2的幂时,为什么
(x MOD y)==(x和(y-1))
。我会尽力解释的

基本上,如果一个数字是2的幂,那么它有一个单位集(因为二进制是基数2)。这意味着所有低位都未设置。例如:
16==10000b,8==1000b
,等等

如果从这些值中减去1。最后,设置的位被取消设置,而其下的所有位都被设置

15=0111b、7=0111b等。因此,基本上是创建一个掩码,用于测试是否设置了任何低位。我希望这是清楚的

编辑:巴斯蒂安·莱昂纳德的评论也很好地涵盖了这一点:

如果你把(无符号)除以4,你就 右移两位。因此 余数是得到 当你分开的时候就失去了。4-1=11b, 也就是说,一个产生两个 当您使用 价值观

编辑:有关可能更清晰的解释,请参阅本页:

它包括检测2的幂,如果是2的幂,则使用和作为快速模运算。

(x&3)==0


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

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

在x86汇编中:

    test eax, 3
    jnz not_multiple_of_4

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

not_multiple_of_4:
    ; ...

是的,我解释了为什么你可以用y-1来获得与MOD y相同的值。@tvanfosson:谢谢你的回退,在你在另一篇帖子中的评论之后,我就要这样做:)。@Evan Teran,我知道你怎么说它们是等价的,但我仍然不明白为什么是y-1?@Mitrax:如果你将(未签名)除以4,将两位向右移位。因此,余数就是这两个位,当你除法的时候,这两个位丢失了。4-1=11b,也就是说,当你用一个值和它相加时,会产生两个最右边的位的掩码。@Bastien:goo-way-to-word,添加到我的答案中。@John--是的,它是0 x 4的乘积。大多数机器只跟踪最后移出的位,或者OP询问的MIP根本没有标志。如果您想使用移位,您可以将移位左移
32-2
以移出所有其他位,只留下可能非零的低位2位。或者更好的办法是,用AND将其隔离,如
x&3