我有一个很大的十六进制数,例如CD4A0619FB0907BC00000
(25!)或任何其他数字。现在,仅使用标准C / C ++代码(没有像Boost这样的库),我想将此数字转换为十进制数15511210043330985984000000。不幸的是,它对于64位整数来说太大了(如long long
)而且我也不想使用任何浮点数据类型。如果这是可能的,你怎么能这样做?
答案 0 :(得分:1)
假设您不想使用任何可能符合您描述资源的资源,例如Boost"等库。简单的答案是编写自己的子集,只需要您需要的操作。 如果32位十六进制数字就足够了,那么最简单的方法是创建自己的128位无符号整数,并为该128位整数代码除以10函数(产生商和余数)。你真的不需要任何其他功能,除以10很容易。将最多32个十六进制数字转换为128位int是微不足道的,并且从一系列除以10生成十进制输出是微不足道的。 如果你想要基本上无限大小,那么将十进制数字表示为一串数字并编写一个例程将其乘以16并添加另一个数字可能更简单。这永远不会是有效的解决方案,可能更容易编码为您的目的和无限的大小。
答案 1 :(得分:1)
vector<unsigned int> bin2dec(vector<unsigned int> binary)
{
vector<unsigned int> decimal;
bool all_zero = false;
// binary[i]: stores 8-bit of the nubmer.
// Ex. 258 = 0x102 => binary[0] = 0x2, binary[1] = 0x1.
while (!all_zero) {
all_zero = true;
for (int i = binary.size() - 1; i >= 0; i--) {
int q = binary[i] / 10;
int r = binary[i] % 10;
binary[i] = q;
if (i > 0) {
binary[i-1] += (r << 8);
} else {
decimal.insert(decimal.begin(), r);
}
if (q != 0) {
all_zero = false;
}
}
}
// each element stands for one digit of the decimal number.
// Ex. 258 => decimal[0] = 2, decimal[1] = 5, decimal[2] = 8.
return decimal;
}
答案 2 :(得分:0)