我正在尝试使用64位整数进行一些乘法和除法。我希望我的结果有64位,任何溢出应该被截断。我已经成功地使用乘法运算:
z = 0xed5c6911
y = 0xFFFFFFFF & (z * 33)
print hex(z)
print hex(y)
输出:
0xed5c6911
0x98e98b31
正如所料。
我现在要反过来说:
z = 0xFFFFFFFF & (y / 33)
print hex(z)
我希望0xed5c6911
是z
的原始值,但我得到0x4a23a85
。
如何撤消第一个代码段中的操作并从z
检索y
的原始值?
答案 0 :(得分:4)
更新:你的掩码只有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,你需要存储一些额外的信息 - 最简单的方法是使用更多位的数据类型。