是否有一套通用规则可以通过乘以已知和未知数字来达到某个数字。 例如 假设x = 13且z = 9
有没有找到y的方法
x * y = z
=> 13 * y = 9
我不想将它们用作数学整数,而是用于比特。所以,我想保持z为int。 显然,位表示中存在溢出,但我不确定如何在没有暴力的情况下找到z强制在32位机器中的所有值。我认为y是一个非常小的数字,负面。
注意:这不是或者是hw赋值,所以你可以将x和y改为任何东西,这些只是例子。
答案 0 :(得分:5)
首先,找到x
(13)mod 2 32 的modular multiplicative inverse。有几种方法可以做,很多人会推荐扩展的欧几里得算法,但对于这种情况来说并不是最简单的。有关更简单的算法,请参阅Hacker's Delight第10章(常数除以整数)。
无论如何,一旦你知道13 mod 2 32 的模乘法逆是0xc4ec4ec5
,那么将该数乘以z
得到y
。< / p>
0xc4ec4ec5 * 9 = 0xec4ec4ed
所以y = 0xec4ec4ed
和0xec4ec4ed * 13
确实是9。
请注意,如果x
是偶数,则它没有反转。如果它“至多与z
一样”(也就是说,它具有与z
一样多或更少的尾随零),则可以在划分出它们的最高公共幂2之后以这种方式解决它。 / p>