反转64位运算中的乘法

时间:2015-09-20 19:39:12

标签: python integer 64-bit division multiplication

我正在尝试使用64位整数进行一些乘法和除法。我希望我的结果有64位,任何溢出应该被截断。我已经成功地使用乘法运算:

z = 0xed5c6911
y = 0xFFFFFFFF & (z * 33)

print hex(z)
print hex(y)

输出:

0xed5c6911
0x98e98b31

正如所料。

我现在要反过来说:

z = 0xFFFFFFFF & (y / 33)
print hex(z)

我希望0xed5c6911z的原始值,但我得到0x4a23a85

如何撤消第一个代码段中的操作并从z检索y的原始值?

2 个答案:

答案 0 :(得分:4)

harold发表评论后

更新:你的掩码只有32位 - 掩盖了64位,你需要用& 0xFFFFFFFFFFFFFFFF掩盖所有整数。

以下所有内容均为 32位

可以反转操作:通过截断为32位,您实际上在整数环Z/2^32 Z中进行计算。 33确实有modular multiplicative inverse

1/33 = 0x3e0f83e1  mod  2^32

因此对于任何 32位数字,您可以通过乘以上面的数字(并截断为32位)来将乘法反转33。

您可以使用extended euclidean algorithm找到反转。数学上这是number theory

的域

请注意,此环中只有奇数具有反转(2是2 ^ 32的唯一素数因子)。

对于 64位,33的倒数是:

1/33 = 0x0f83e0f83e0f83e1  mod  2^64

答案 1 :(得分:-1)

您无法从y检索z的原始值。

当您在第一个示例中截断(z * 33)的乘法时,您将丢失信息 - 在这种情况下是高位。然后当你进行除法时,你将除以一个不同的值(z * 33),因此无法恢复z。

为了实际获得z,你需要存储一些额外的信息 - 最简单的方法是使用更多位的数据类型。