【问题标题】:C++ Conversion to Vector Representation of a Number in Any Base [duplicate]C ++转换为任意基数的向量表示[重复]
【发布时间】:2013-01-29 14:27:48
【问题描述】:

可能重复:
c++ template for conversion between decimal and arbitrary base

我想将unsigned int 的实例转换为基数 X 中的std::vector<unsigned int> 实例,其中 X 是从 2 到 unsigned int 可以表示的最大数之间的任意数字。

编辑:我曾经说过unsigned int 以 10 为基数,但它得到了关键的 cmets,我认为这是正确的,所以我将其删除以避免混淆。

关于 SO 有很多问题和答案,包括 itoa 之类的东西,它可以转换为基数 16 或 32 或一些小数字(this itoa implementation page 被指出是很好的资源)。对于比这大得多的碱基,我找不到很好的转换。

注意:性能不是问题(在合理范围内)。

【问题讨论】:

  • 您所说的“unsigned int 以 10 为底的实例”到底是什么意思? unsigned ints 通常存储在 base 2 中。
  • 为什么不自己写呢?没有标准的方法。
  • “以 10 为基数的 unsigned int 的实例”没有任何意义。基数是数字的表示的属性,而不是数字本身的属性。
  • @LexFridman:当然,您可以简单地扩展它,或者将其修改为仅写入每个数字的整数值。

标签: c++ vector numbers base base-conversion


【解决方案1】:

应该这样做。

std::vector<unsigned int> result;
unsigned int base = ...;
unsigned int input = ...;
while(input) {
  result.push_back(input%base);
  input /= base;
}

【讨论】:

  • 如果你 push_back 你必须反转 result 向量。
  • 我不同意。如果你push_back(),那么result[0] 是个数列,result[1] 是 10 的列,result[2] 是 100 的列,等等(例如假设基数为 10)。这让我印象深刻,因为它是向量的自然顺序。
  • 像 4 这样的小数应该产生一个以 2 为底的向量 {1,0,0} 而不是 {0,0,1}
  • 如果你想要一个反向的答案,那么你需要申请std::reverse。没什么大不了的。
  • 附言。如果您需要 bigendian 存储,请在问题中提及。
【解决方案2】:

以下代码将x 转换为基数base 中的向量。如果需要满足结果向量的minSize 大小,它还会用额外的零填充结果向量。

vector<unsigned int> intToAnyBase(unsigned int x, int base, int minSize = 1) {
    assert(base >= 2);

    // minSize allows us to pad the resulting vector
    // with extra zeros at the front if needed
    minSize = std::max(1, minSize);

    std::vector<unsigned int> v;
    while(x > 0) {
        res.push_back(x % base);
        x /= base;
    }

    // Append zeros to the "front" to satisfy 'minSize' requirement.
    // This also adds support for x
    if(v.size() < minSize) {
        v.reserve(minSize);
        while(v.size() < minSize)
            v.push_back(0);
    }

    std::reverse(v.begin(), v.end());

    return v;
}

请注意,结果向量在函数中是相反的,例如,十进制 4 会生成 {1,0,0} 而不是 {0,0,1}

【讨论】:

    【解决方案3】:
    std::vector<unsigned int> toBaseX(unsigned int number, unsigned int base)
    {
        std::vector<unsigned int> res;
    
        if (number == 0)
        {
            res.push_back(0);
            return res;
        }
    
        while (number > 0)
        {
            unsigned int currentDigit = number % base;
            res.push_back(currentDigit);
            number /= base;
        }
        return res;
    }
    

    【讨论】:

    • vector 没有push_front
    • @Fanael:正确,将在几秒钟内修复。
    • 现在,使用push_back 你会得到相反的结果。
    • 另外,它应该处理number = 0
    • @Fanael:“反向”这只是一种前瞻性的方式。实际上持有 LSB 的索引 [0] 似乎更直观。
    猜你喜欢
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    相关资源
    最近更新 更多