【问题标题】:Bitwise multiplication to achieve result按位乘法得到结果
【发布时间】:2014-09-23 06:19:45
【问题描述】:
是否有一套通用的规则可以通过将已知数和未知数相乘来获得某个数。
例如
假设 x = 13 和 z = 9
有没有办法找到y这样的
x * y = z
=> 13 * y = 9
我不想将它们用作数学整数,而是以位为单位。所以,我想保留 z 一个整数。
显然,位表示存在溢出,但我不确定如何在不强制 32 位机器中的所有值的情况下找到 z 。我认为 y 将是一个非常小的数字,负数。
注意:这不是硬件分配,因此您可以将 x 和 y 更改为任何值,这些只是示例。
【问题讨论】:
标签:
c
bit-manipulation
multiplication
bit-shift
bits
【解决方案1】:
首先,找到x (13) mod 232 的modular multiplicative inverse。有几种方法可以做到,很多人会推荐扩展欧几里得算法,但对于这种情况,它并不是最简单的。有关更简单的算法,请参阅 Hacker's Delight 第 10 章(整数除以常数)。
无论如何,一旦你知道 13 mod 232 的模乘逆是 0xc4ec4ec5,将该数字乘以 z 得到 y。
0xc4ec4ec5 * 9 = 0xec4ec4ed
所以y = 0xec4ec4ed 和0xec4ec4ed * 13 确实是 9。
请注意,如果x 是偶数,则它没有逆。如果它“最多与z 相同”(也就是说,它的尾随零与z 一样多或更少),您可以在除以它们的最高公共幂 2 后以这种方式解决它。