按位乘法来实现结果

时间:2014-09-23 06:19:46

标签: c bit-manipulation multiplication bit-shift bits

是否有一套通用规则可以通过乘以已知和未知数字来达到某个数字。 例如 假设x = 13且z = 9

有没有找到y的方法

    x * y = z     
=> 13 * y = 9

我不想将它们用作数学整数,而是用于比特。所以,我想保持z为int。 显然,位表示中存在溢出,但我不确定如何在没有暴力的情况下找到z强制在32位机器中的所有值。我认为y是一个非常小的数字,负面。

注意:这不是或者是hw赋值,所以你可以将x和y改为任何东西,这些只是例子。

1 个答案:

答案 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 = 0xec4ec4ed0xec4ec4ed * 13确实是9。

请注意,如果x是偶数,则它没有反转。如果它“至多与z一样”(也就是说,它具有与z一样多或更少的尾随零),则可以在划分出它们的最高公共幂2之后以这种方式解决它。 / p>