Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 按位乘法以获得结果_C_Bit Manipulation_Multiplication_Bit Shift_Bits - Fatal编程技术网

C 按位乘法以获得结果

C 按位乘法以获得结果,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=13,z=9

有没有办法找到这样的y

    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之后,用这种方法来求解它。

这用于编译器优化的快速除法这用于编译器优化的快速除法