假设您有一个机器指令 udive,它通过采用 (32 位被除数
// assume: a / b guaranteed not to overflow
a = 64bit dividend, a.h & a.l are hi & lo 32bits respectively
b = 32bit divisor
q1 = udive(a.h, b) // (a.h << 32) / b
r1 = -(q1 * b) // remainder of the above, shortcut since a.h & 0xffffffff == 0
q2 = a.l / b // a.l / b using regular unsigned division
r2 = a.l - (q2 * b) // remainder of the above
q = q1 + q2
r = r1 + r2
// r < r2, r overflowed and is >32bits, implies r > b since b is 32bits
// r >= b, quotient too small by 1, adjust
if (r < r2) or (r >= b)
q = q + 1
return q
然而,签署的案件给我带来了问题。假设有一个等效的 sdive 指令执行 udive 的签名版本,我无法完全弄清楚如何处理余数等。
我认为,如果明确说明哪些变量是 32 位、哪些变量是 64 位以及比较是有符号的还是无符号的,那么你的无符号代码会更容易阅读。
这本书黑客的喜悦通常适合这种低级算术的东西。我目前手头没有副本,但它在给定 64/32->32 的情况下执行 64/64->64 的代码在线:http://www.hackersdelight.org/HDcode/newCode/divDouble.c
通过简单地获取输入的绝对值,进行无符号除法,然后如果输入具有不同的符号则翻转结果位的符号来完成有符号情况。这对我来说这可能是最好的方法(它肯定比其他方法更容易证明正确)。您可能需要将股息作为特殊情况,使其成为可能的最小整数(如果它不会随波逐流)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)