如何找出在两个整数的乘积中设置了多少位(等于 1)

How to find out how many bits are set (equal 1) in the product of two integers

本文关键字:设置 等于 多少 何找出 两个 整数      更新时间:2023-10-16

我正在寻找一种算法解决方案,以找出如果我将两个整数相乘,则设置了多少位(等于 1(。我有数字 A 和 B,介于 0 和 MAX_INT 之间,以消除负数。如何找出在乘积 C = A * B 中将设置多少位。

-当然,计算C并计算位不是正确的解决方案,它不适用于高值

-我用 C 和 C++ 工作,但这是一个相当普遍的算法问题。我必须在没有任何数学/提升库帮助的情况下解决它。

尝试找到一个通用的解决方案来了解位计数,但我猜测的仅适用于相当多的示例,它完全失败了,数字很高。

这个问题需要一个算法。这个问题可以在不持有完整乘积的情况下解决,通过一次计算每个位,从位 0 开始。

C0是从A0 * B0的乘积中找到的,要么是0的,要么是1的。

C1是从A0 * B1 + A1 * B0的产品总和中找到的,并记住任何携带。

C2 是从 carry + A0 * B2 + A1 * B1 + A2 * B0 的总和中找到的,依此类推。

当你进行时,你对单个乘积位求和,这给出了所需的答案:设置位数。

似乎没有比执行乘法和计算结果中的位数更简单的通用解决方案。如果数字非常大,则可以在切片中执行乘法,但执行时间会有很大的成本。

但是,您可能会发现一些特殊情况很有用:

如果 A 或 B 正好设置了 0 位(A == 0 或 B == 0(,
  • 则 C 将设置了 0 位 (C == 0(,这是 C 设置了 0 位的唯一方法。
  • 如果 A 或 B
  • 正好设置了 1 位(A 或 B 是 2 的幂(,则 C 将设置与其他数字相同的位数。此外,要使 C 恰好设置了 1 位,A 和 B 都必须是 2 的幂。
  • C 中设置的位数小于 A 和 B 中有效位数的总和。
  • C 中未设置的最低有效位数是 A 中未设置的最低有效位
  • 数加上 C 中未设置的最低有效位数之和。

没有简单的通用解决方案。

例如,请参阅以下乘法

3(0b0011) * 4(0b0100) = 12(0b1100)
3(0b0011) * 5(0b0101) = 15(0b1111)
3(0b0011) * 6(0b0110) = 18(0b10010)

原因是乘法中可能存在一些进位,它们会在输出中产生涟漪并以不可预测的方式改变 1 的数量。

您需要进行乘法,然后计算位数。

由于A * BMAX_INT(通常为 31 位(,因此您需要一个 64 位数字。您可以使用uint64_t