如何将整数数组相乘得到一个数字?

How do multiply an array of ints to result in a single number?

本文关键字:一个 数字 整数 数组      更新时间:2023-10-16

所以我有一个 int 分解成一个较小的整数数组。例如,int num = 136928变为int num[3] = {13,69,28}。我需要将数组乘以某个数字。正常操作将是136928 * 2 == 273856。但是我需要做[13,69,28] * 2再次以数组的形式给出与136928 * 2相同的答案 - 结果应该是

for(int i : arr) {
i *= 2;
//Should multiply everything in the array
//so that arr now equals {27,38,56}
}

有关如何执行此操作的任何帮助将不胜感激(还需要使用乘法浮点数(,例如arr * 0.5应该将数组中的所有内容减半。

对于那些想知道的人,该数字必须拆分为一个数组,因为它太大而无法以任何标准类型(64字节(存储。具体来说,我正在尝试对 sha256 哈希的结果执行数学运算。哈希返回哈希数组作为uint8_t[64]

考虑改用 Boost.Multiprecision。具体而言,cpp_int类型,它是任意大小的整数值的表示形式。

//In your includes...
#include <boost/multiprecision/cpp_int.hpp>
//In your relevant code:
bool is_little_endian = /*...*/;//Might need to flip this
uint8_t values[64];
boost::multiprecision::cpp_int value;
boost::multiprecision::cpp_int::import_bits(
value, 
std::begin(values), 
std::end(values), 
is_little_endian
);
//easy arithmetic to perform
value *= 2;
boost::multiprecision::cpp_int::export_bits(
value, 
std::begin(values), 
8, 
is_little_endian
);
//values now contains the properly multiplied result

从理论上讲,这应该适用于大小合适的类型uint512_t,在与cpp_int相同的命名空间中找到,但我现在没有C++编译器进行测试,所以我无法验证。如果它确实有效,您应该更喜欢uint512_t,因为它可能比任意大小的整数更快。

如果您只需要乘以/除以两 (2(,那么您可以简单地移动构成该值的每个字节中的位。

所以对于乘法,你从左边开始(我在这里假设大端序(。然后,您获取字节的最高有效位并将其存储在临时变量(可能的进位(中。然后,将其他位向左移动。移位后,存储的位将是下一个字节的最低有效位。重复此操作,直到处理完所有字节。您可能会留下一个进位,如果您正在执行模 2^512(64 字节(的操作,您可以扔掉它。

除法类似,但你从右边开始,你携带每个字节的最低有效位。如果你去掉最右边的位,那么你计算计算的"下限"(即三除以二将是一,而不是一个半或二(。


这在以下情况下很有用

  1. 您不想复制字节或
  2. 如果您只需要位运算,并且您不想包含多精度/大整数库。

为了便于维护,建议使用大整数库。