按位乘法来实现结果

1 c bits bit-manipulation bit-shift multiplication

是否存在一组通用规则,通过乘以已知和未知数字来实现某个数字.例如假设x = 13且z = 9

有没有办法找到这样的

    x * y = z     
=> 13 * y = 9
Run Code Online (Sandbox Code Playgroud)

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

注意:这不是或者是一个新的赋值,因此您可以将x和y更改为任何内容,这些只是示例.

har*_*old 5

首先,找到模反元素x(13)模2 32.有几种方法可以做,很多人会推荐扩展的欧几里得算法,但对于这种情况来说并不是最简单的.有关更简单的算法,请参阅Hacker's Delight第10章(常数除以整数).

无论如何,一旦你知道的13模2的模反元素320xc4ec4ec5,乘该数字将z得到y.

0xc4ec4ec5 * 9 = 0xec4ec4ed

所以y = 0xec4ec4ed,0xec4ec4ed * 13确实是9.

注意,如果x是偶数,则它没有反转.如果它"最多只是为了z"(也就是说,它具有多于或少于尾随的零z),则可以在分割出它们的最高共同功率2之后以这种方式解决它.