C 按位乘法以获得结果
是否有一套通用的规则通过乘以已知和未知的数字来获得某个数字。 例如 假设x=13,z=9 有没有办法找到这样的yC 按位乘法以获得结果,c,bit-manipulation,multiplication,bit-shift,bits,C,Bit Manipulation,Multiplication,Bit Shift,Bits,是否有一套通用的规则通过乘以已知和未知的数字来获得某个数字。 例如 假设x=13,z=9 有没有办法找到这样的y x * y = z => 13 * y = 9 我不想把它们当作数学整数,而是用位来表示。所以,我想保持z为int。 显然,位表示中存在溢出,但我不确定如何在32位机器中不强制执行所有值的情况下找到z。我认为y是一个非常小的数字,负数 注意:这不是hw分配或hw分配,因此您可以将x和y更改为任何值,这些只是示例。首先,查找x(13)mod 232的值。有几种
x * y = z
=> 13 * y = 9
我不想把它们当作数学整数,而是用位来表示。所以,我想保持z为int。
显然,位表示中存在溢出,但我不确定如何在32位机器中不强制执行所有值的情况下找到z。我认为y是一个非常小的数字,负数
注意:这不是hw分配或hw分配,因此您可以将x和y更改为任何值,这些只是示例。首先,查找x
(13)mod 232的值。有几种方法可以做到这一点,许多人会推荐扩展的欧几里德算法,但对于这种情况,它不是最简单的。有关更简单的算法,请参见《黑客之乐》第10章(整数除以常数)
无论如何,一旦知道13 mod 232的模乘逆是0xc4ec4ec5
,将该数字乘以z
,得到y
0xc4ec4ec5*9=0xec4ec4ed
所以y=0xec4ec4ed
,而0xec4ec4ed*13
实际上是9
请注意,如果x
为偶数,则它没有反比。如果它“最多等于z
”(也就是说,它的尾随零数与z
)一样多或更少,那么在除以它们的最高公幂2之后,你可以用这种方法求解它。首先,找到x
(13)mod 232的值。有几种方法可以做到这一点,许多人会推荐扩展的欧几里德算法,但对于这种情况,它不是最简单的。有关更简单的算法,请参见《黑客之乐》第10章(整数除以常数)
无论如何,一旦知道13 mod 232的模乘逆是0xc4ec4ec5
,将该数字乘以z
,得到y
0xc4ec4ec5*9=0xec4ec4ed
所以y=0xec4ec4ed
,而0xec4ec4ed*13
实际上是9
请注意,如果
x
为偶数,则它没有反比。如果它“最多与z
(也就是说,它的尾随零与z
)一样多或更少),你可以在除掉它们的最高公幂2之后,用这种方法来求解它。这用于编译器优化的快速除法这用于编译器优化的快速除法