从int向量中返回unsigned long的最佳方法是什么?我正在用c ++编写一个BigInt类,我将大数字存储在一个向量中。我想编写一个方法,将该向量作为标准长度返回,前提是它不大于unsigned long可以容纳的长度。感谢
答案 0 :(得分:2)
沿着这些方向的东西,假设整数存储在具有最低有效值的向量中:
size_t bits_in_int = std::numeric_limits<int>::digits;
size_t bits_in_ulong = std::numeric_limits<unsigned long>::digits;
unsigned long accumulator = 0;
size_t bits_so_far = 0;
for (unsigned long i : the_ints) {
size_t next_bits = bits_so_far + bits_in_int;
if (next_bits > bits_in_long) { /* failed, do something about it */}
accumulator += (i << bits_so_far);
bits_so_far = next_bits;
}
return accumulator;
注意:
1)在实践中你可以节省一些麻烦,因为在任何看似正常的C ++实现中,循环的数量将是1或2。因此,您可以写一个返回the_ints[0]
的案例和一个返回the_ints[0] + (the_ints[1] << bits_in_int)
的案例。
2)我一直懒惰。由于int
已签名且unsigned long
未签名,因此您实际上可以将至少一个int
加上另一个int
的最低有效位放入unsigned long
。例如,您可能会发现bits_in_int
为31,但bits_in_long
为32。
所以实际上在“失败”的情况下,和平有一个最后的希望,即(a)只剩下一个int
来处理,而(b)它的价值适合于其余的结果。但就像我说的那样,我很懒,我想我已经展示了你需要组合的组件。
出于这个原因,如果没有其他原因,你应该为你的BigInt使用unsigned int
的向量。 unsigned long
的宽度不需要unsigned int
中的位数的倍数,但是可以忽略它。这可能很奇怪。
基数10位数的更新,首先存储最重要的数据:
if (the_ints.size() <= std::numeric_limits<unsigned long>::digits10 + 1) {
std::stringstream ss;
for (int i : the_ints) ss << char(i + '0');
unsigned long result;
if (ss >> result) return result;
}
/* failed, do something about it */