【发布时间】:2016-07-31 23:49:58
【问题描述】:
a * x = b
我有一个看似相当复杂的乘法/imul 问题:如果我有 a 和我有 b,如果它们都是 32 位双字,我如何计算 x(例如 0-1 = FFFFFFFF,FFFFFFFF+1 = 0 )? 例如:
0xcb9102df * x = 0x4d243a5d
在这种情况下,x 是 0x1908c643。我发现了一个类似的问题,但前提不同,我希望有一个比给出的更简单的解决方案。
【问题讨论】:
-
分成大小,做4次乘法和加法。 (L1+S1)*(L2+S2)
-
这可能并不总是有一个唯一的解决方案,我不确定。我的第一个想法是找到multiplicative inverse,这是编译器将除法转换为乘法的方式,这对于像 32 位整数这样的模块化类型是可能的。 gcc just generates code that return 0 or 1 用于除以
0xcb9102df,当然。 (除以小整数时存在乘法逆元,例如我在那个godbolt链接中包含的 div13 函数)。 -
我有这个等式(十进制)
4*x=?2, ?是溢出的数字。我可以恢复 x 吗?