首页 > 解决方案 > 哪个 int32 寄存器内容乘以 42 得到结果 1?

问题描述

我试图了解如何在 int32 register 中表示浮点值R0

我需要找到R0where的值R0 * 42 = 1

我可以投入什么价值R0

我一直在尝试放置 R0 1/42,但这将是0因为它是 int。

有什么建议么?

标签: cassemblycpu-registers

解决方案


您要问的是 32 位乘法的 42 的乘法非浮点逆数。
这将是一个整数,如果在 32 位寄存器中乘以 42,将得到 1。
正如 Erik Eidt 指出的那样,这不是严格的数学逆,更多的是一个的效果,正如溢出的模效应所展示的那样.

让我们绕道寻找一个数字,如果乘以 42,则在 32 位寄存器中得到 2。这个数字是 0x3CF3CF3D。2的结果是截断到32bit造成的,因为0x3CF3CF3D乘以42就是0xA00000002,而“A”部分超出了32bit。注意 0x3CF3CF3D 是奇数,没有整数的一半。

然而,没有这种神奇的倒数会导致 1,因为任何数字乘以偶数(如 42)都不会产生任何奇数,无论超过 32 位的部分可能有多大。(归功于 Nate Eldredge,他在评论中指出了这一令人信服的观察结果)。

同样的 0x3CF3CF3D 乘以 21 得到 1(实际上是 0x500000001)。
所以对于这个奇数 21,乘法逆元确实存在,但对于 42 不存在。


推荐阅读