如何将表示二进制的 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++的主要内容,如果未能解决你的问题,请参考以下文章