假设您有 32 位算术:2**24 = 16777216,因此将 x 作为最重要的 2 个字节,将 y 作为最不重要的 3:
(16777216 * x + y) / 1000
= (16777000 * x + 216 * x + y) / 1000
= 16777 * x + (216 * x + y) / 1000
第一项可以用 32 位计算而不会溢出(因为x < 2**16)。第二项也可以在没有溢出的情况下计算(因为x < 2**16和y < 2**24)。
这基本上2**24是基于 2 位值的长除法,但预先计算的术语知道除数是 1000。选择一千是因为它是大于 10 的最小幂2**8。
因此,首先计算最低三位数字,使用(2**32) % 1000 == 296. 所以这次我们将x作为最高字节,y作为低4字节
((2**32) * x + y) % 1000 = ((2**32) * x) % 1000 + y % 1000 (modulo 1000)
= (296 * x) % 1000 + y % 1000 (modulo 1000)
((2**32) * x + y) % 1000 = ((296 * x) % 1000 + y % 1000) % 1000
然后使用上面的公式将原始数字除以 1000。然后您就可以安全地进入 32 位领域,并且可以使用正常循环生成剩余的数字。
顺便说一句,如果我是你,我会检查结果:我没有测试过这个,我可能在某个地方犯了错误。应该很容易与在 PC 上使用 64 位整数中的常用方法完成的 bcd 转换结果进行比较。