因此,我将一个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]
。
答案 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字节)进行模运算,就可以扔掉。
除法类似,但是您从右边开始,并且携带每个字节的最低有效位。如果删除最右边的位,则会计算出计算的“底数”(即,三除以二将是一,而不是一分半或二)。
这在以下情况下很有用
为了可维护性,建议使用大整数库。