如何找出在两个整数的乘积中设置了多少位(等于 1)
How to find out how many bits are set (equal 1) in the product of two integers
我正在寻找一种算法解决方案,以找出如果我将两个整数相乘,则设置了多少位(等于 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
* B
是MAX_INT
(通常为 31 位(,因此您需要一个 64 位数字。您可以使用uint64_t
相关文章:
- 为什么将一个结构的引用设置为等于另一个结构只会更改一个数据成员?
- 将向量设置为等于 {};
- 在 c++ 中将对象设置为等于同一类的构造函数是否有效?
- 如何在调整列表视图大小时将标题宽度设置为等于其列表视图控件宽度
- 如何将矩阵中的所有对角线设置为等于零?
- 如何找出在两个整数的乘积中设置了多少位(等于 1)
- 将数组设置在一个对象中,等于另一个对象中的数组
- 如果将变量设置为等于新对象,旧对象会发生什么情况?
- 调用功能并将其设置为等于结构
- 当设置对象等于另一个函数的返回值时,为什么要调用移动构造函数/分配
- 设置一个等于等于NullPtr的变量的变量
- 是否将常量字符*设置为等于字符[]文字安全
- 如何使一个成员变量等于在main()中设置的另一个成员变量
- 设置等于整个数组C 的数组的元素
- 在字符串中设置一个等于 int + "," 的某个字母
- 设置整数等于数组中的值数量
- 将等于369的字符设置为与113相同的二进制图案是UB行为
- 将void*指针设置为等于整数
- 将旧向量设置为等于新向量
- 如果我将 int 设置为等于 2 个最大整数的总和会发生什么