c++ - 从整数 vector 返回一个无符号长整数 C++

标签 c++ vector unsigned bigint

从整数 vector 返回无符号长整数的最佳方法是什么?我正在使用 C++ 编写 BigInt 类,并将大量数字存储在 vector 中。我想编写一个方法,将此 vector 作为标准 long 返回,前提是它不大于 unsigned long 可以容纳的大小。谢谢

最佳答案

按照这些思路,假设整数存储在 vector 中,最低有效位在前:

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) 它的值适合结果的剩余位。但就像我说的,我很懒,我想我已经展示了您需要组装的组件。

出于这个原因,如果没有其他原因,您可能应该使用 unsigned int 的 vector 为你的 BigInt。不需要 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 */

关于c++ - 从整数 vector 返回一个无符号长整数 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20480523/

相关文章:

c# - C# 中的一些奇怪的东西 - UInt32 与 Int32

将 C 中的无符号字符转换为 MatLab

c++ - 用随机数填充 vector c++

c++ - 编译器警告

c++ - 哪个更有效 : Return a value vs. 通过引用传递?

c++ - 如何使用 winsock 标记客户端

c++ - vector 字符串推导出什么类型?

作为向量的 Clojure 惰性序列

c++ - 什么时候适合使用 Qt 信号向下通信依赖树?

c++ - 包括仅当满足 static constexpr 时才编译的代码 C++