如何将表示二进制的 int 向量转换为表示十进制数的 int 向量? C++

Posted

技术标签:

【中文标题】如何将表示二进制的 int 向量转换为表示十进制数的 int 向量? C++【英文标题】:How to convert a vector of int representing binary to and vector of int representing the decimal number? C++ 【发布时间】:2011-01-24 00:21:31 【问题描述】:

我正在制作一个大整数库,并且我有一个表示二进制数的 int 的 STL 向量。

二进制向量将包含 0,0,1,1 我需要将这个数字的十进制表示存储在另一个像这样的向量中 2,1

我想知道最好的方法是什么?

我也不能使用像 pow 这样的函数,因为这需要处理大数字。

【问题讨论】:

如果你正在制作一个大整数库,那么实现“pow”(或者任何你需要的,如果你的内部表示是二进制的,可能是除法和减法)首先,然后在基本算术之上实现二进制到十进制的转换。 为每个 vector 元素存储一位并不是实现大整数的一种非常有效的方法。 所以您正在寻找从二进制表示转换为十进制表示。 11 二进制是 3 十进制,而不是 21。我错过了什么吗? @Guy,数字是按顺序存储的,即 0,0,1,1 = 1100 = 12 = 2,1 我认为“小端”这个词在这个顺序中更常见。 【参考方案1】:

最直接的方法是通过模拟十进制加法来简单地将每个 2 的幂的十进制表示相加。

您可以迭代地获得每个 2 的幂的十进制表示,即 pow(2,n+1) = pow(2,n) + pow(2,n)。

所以基本上,一旦你确定了小数加法,一切都应该很容易。这可能不是最有效的方法(它的位数O(n^2)),但它肯定可以工作。

【讨论】:

加法都可以根据位置值发生,没有任何进位。然后,进位可以在最后一步发生。【参考方案2】:

Knuth 的“计算机编程艺术”第 2 卷是任意精度算术的极好参考。

获得以 10 为底的表示的一种简单方法是将您的数字连续除以 10,每个除法提取一个数字(余数)。这显然需要能够在您已有的任何基础上除以 10。

例如,如果你的数字是十进制的 321 或二进制的 101000001,我们可以除法:

10100001 二进制乘 1010 二进制

100000 余数为 1(所以第一个数字是 1 个小数)

100000 除以 1010 二进制

11 余 10(所以下一位是小数点后 2)

11除以1010二进制

0 余 11(所以最后一位是小数点 3)

根据:http://people.cis.ksu.edu/~rhowell/calculator/comparison.html 这是 Sun 的 Java BigInteger 类中使用的基数转换算法,复杂度为 O(n^2)。此链接中的作者基于 Knuth p.1 中描述的算法实现了 O(n logn) 算法。 592 并记入 A. Shönhage。

【讨论】:

【参考方案3】:

类似的东西:

int a;
int temp;
a = 21;
vector<int> vet;

while(a>0)

temp = a % 10;
vet.push_back(temp);
a = a/10;

【讨论】:

此代码要求a 适合int;该帖子要求允许任意大小的数字。

以上是关于如何将表示二进制的 int 向量转换为表示十进制数的 int 向量? C++的主要内容,如果未能解决你的问题,请参考以下文章

如何将二进制表示的数字转换为雪花数

怎么把float型转换成int

求教如何Python十进制小数和二进制小数相互转换的实现方式,用代码表示出来,谢谢

在C语言中如何将10进制转换成16进制?

float型怎样强制转换成int型

使用相同的表示将二进制字符串转换为int