没有除法运算符的处理器上的汇编 mod 算法
我需要实现一个简单的宏,用于在没有除法运算符的处理器(例如 ARM)上查找两个数字的模。 我可以通过重复减法来使用除法,但我不知道这是否是最有效或最容易使用的。
有什么建议么? 代码会更有帮助。 这个特定的类让我们使用 SPARC 的子集,因此大多数操作如下所示:add r1, r2, rdest
。
这个特定的赋值要求检查a mod b == 0
或者除法的余数是否为零。 因此,任何有关有效实施的提示或建议都将受到欢迎。
I need to implement a simple macro that finds the modulo of two numbers on a processor that doesn't have a division operator (think ARM). I could use division by repeated subtraction, but I don't know if this was the most efficient or easiest to work with.
Any suggestions? Code would be even more helpful. This particular class has us using a subset of SPARC, so most operations look like this: add r1, r2, rdest
.
This particular assignment calls for checking that a mod b == 0
or that the remainder of the division is zero. So any hints or suggestions toward an efficient implementation would be most welcome.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
不知道你限制的具体操作是什么,但我认为你会用伪代码进行长除法,如下所示:
要实际计算商(或至少其绝对值),最后一部分将是类似于:
这些都没有经过测试,并且可能充满错误。
No idea what exact operations you are limited to, but I'd think you'd do long division, something like this, in pseudo-code:
To actually calculate the quotient (or at least its absolute value), the last part would be something like:
None of this is tested, and it is probably riddled with errors.
这并没有直接回答您的问题,但仍然是一个有趣的案例。 如果该数字以 2 的幂为模,则该运算可以执行为
使用单个 AND 运算,通常是一个或两个周期运算。
更多信息维基百科
This doesn't answer your question directly but is an interesting case nonetheless. If the number is being modulo'd by a power of two the operation can be performed as
Which uses a single AND operation, which usually is a one or two cycle operation.
More information At Wikipedia
我可以想到两种可能的方法。 因为这是家庭作业,所以我只会提及它们,并让您工作(如果它们可行)以及如何实现它们:
A/B = 2^(log2(A)-log2(b)):如果您可以获得对数
二进制长除法:在进行除法之前,您已经学会了如何进行十进制长除法,对吧? 所以教你的计算机进行二进制长除法(实际上二进制应该更容易)。
(编辑:更正#1,对数除法方程)
I can think of two possible approaches. Because this is homework I will just mention them and let you work if they are feasible and how to implement them:
A/B = 2^(log2(A)-log2(b)): If you can get the logarithm of the values, you can closely approximate the division.
Binary Long Division: You learned how to do decimal long division before you could do division, right? So teach your computer to do binary long division (it should actually be easier in binary).
(edit: corrected #1., the log division equation)
似乎用 b 减去(或加,如果 a 为负数)直到达到或跨越 0 将是一个简单的实现,尽管几乎肯定不是最有效的。
Seems like subtracting (or adding if a is negative) by b until you hit or cross 0 would be an easy implementation albeit almost certainly not the most efficient.
Jweede,我不知道如何解决你的问题,但我发现了一个看似相关的帖子 在这里。
Jweede, I had no idea how to solve your problem but I found a seemingly relevent post here.
A/B=Q,因此A=B*Q。 我们都知道 A 和 A 。 B,我们想要 Q。
我的想法是:
二分查找 Q。从 Q=0 & 开始 Q=1,也许作为基本情况。 继续加倍直到B*Q> A,然后你就有了两个界限(Q 和 Q/2),所以找到这两个界限之间的正确 Q。 O(log(A/B)),但实现起来有点棘手:
此外,您还可以迭代这些位,将每个位设置为 1。如果 B * Q <= A 为 true,则将该位保持为 1,否则将其归零。 继续MSB→LSB。 (但是,您需要能够检测到 B*Q 是否会溢出。
A/B=Q, therefore A=B*Q. We know both A & B, we want Q.
My idea to add to the mix:
Binary search Q. Start with Q=0 & Q=1, perhaps as base cases. Keep doubling until B * Q > A, and then you've got two bounds (Q and Q/2), so find the correct Q between the two of those. O(log(A/B)), but a bit trickier to implement:
Additionally, you can also iterate through the bits, setting each one to 1. If B * Q <= A is true, keep the bit as 1, otherwise zero it. Proceed MSB->LSB. (You will need to be able to detect it B*Q will overflow, however.
谢谢你的建议!
我开始使用简单的除法重复减法算法来实现这一点。 但正如 ysth 所指出的,还有一种更简单的方法。 这是第一个算法:
这非常类似于:
Thanks for the advice all!
I started using a simple division by repeated subtraction algorithm to implement this. But as pointed out by ysth, there's a much easier way. Here's the first algorithm:
This closely resembles:
mod 可以一点一点地计算:
得到余数,q 就是商。
如果您有 bsrl 指令,您可以为 i 设置更好的上限,因为您只能从最高有效位开始。
mod can be computed bit by bit:
That gives you the remainder, q would be the quotient.
If you have bsrl instruction, you can set a better high bound for i, since you can start at the most significant bit only.