如何将一个整数数组相乘以得出单个数字?

时间:2018-06-26 21:26:21

标签: c++ arrays sorting math cryptography

因此,我将一个int分解为较小的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]

2 个答案:

答案 0 :(得分:2)

请考虑改用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,因为它可能比任意大小的整数要快。

答案 1 :(得分:1)

如果您只需要乘以/除以两(2),则只需简单地移位组成该值的每个字节中的位。

所以对于乘法,您从左边开始(我在这里假设是大端)。然后,您将字节的最高有效位存储在temp var中(可能的进位位)。然后,将其他位向左移动。移位后,存储的位将是下一个字节的最低有效位。重复此过程,直到处理完所有字节。您可能只剩下一个进位位,如果要对2 ^ 512(64字节)进行模运算,就可以扔掉。

除法类似,但是您从右边开始,并且携带每个字节的最低有效位。如果删除最右边的位,则会计算出计算的“底数”(即,三除以二将是一,而不是一分半或二)。


这在以下情况下很有用

  1. 您不想复制字节或
  2. 如果您仅需要位操作,并且不想包含多精度/大整数库,则

为了可维护性,建议使用大整数库。