gpt4 book ai didi

c - 如何在 C 中将 128 位整数转换为十进制 ascii 字符串?

转载 作者:太空宇宙 更新时间:2023-11-04 04:20:01 25 4
gpt4 key购买 nike

我正在尝试将存储为 4 个无符号整数数组的 128 位无符号整数转换为 C 中的十进制字符串表示形式:

unsigned int src[] = { 0x12345678, 0x90abcdef, 0xfedcba90, 0x8765421 };
printf("%s", some_func(src)); // gives "53072739890371098123344"

(上面的输入和输出示例完全是虚构的;我不知道该输入会产生什么。)

如果我要使用十六进制、二进制或八进制,这将是一个简单的掩码和位移位问题,以剥离最低有效字符。但是,在我看来,我需要以 10 为基数除法。不幸的是,我不记得如何跨多个整数执行此操作,而且我使用的系统不支持大于 32 位的数据类型,因此无法使用 128 位类型。使用不同的语言也是不可能的,我宁愿避免仅仅为了这个操作而使用大数字库。

最佳答案

除法是不必要的:

#include <string.h>
#include <stdio.h>

typedef unsigned long uint32;

/* N[0] - contains least significant bits, N[3] - most significant */
char* Bin128ToDec(const uint32 N[4])
{
// log10(x) = log2(x) / log2(10) ~= log2(x) / 3.322
static char s[128 / 3 + 1 + 1];
uint32 n[4];
char* p = s;
int i;

memset(s, '0', sizeof(s) - 1);
s[sizeof(s) - 1] = '\0';

memcpy(n, N, sizeof(n));

for (i = 0; i < 128; i++)
{
int j, carry;

carry = (n[3] >= 0x80000000);
// Shift n[] left, doubling it
n[3] = ((n[3] << 1) & 0xFFFFFFFF) + (n[2] >= 0x80000000);
n[2] = ((n[2] << 1) & 0xFFFFFFFF) + (n[1] >= 0x80000000);
n[1] = ((n[1] << 1) & 0xFFFFFFFF) + (n[0] >= 0x80000000);
n[0] = ((n[0] << 1) & 0xFFFFFFFF);

// Add s[] to itself in decimal, doubling it
for (j = sizeof(s) - 2; j >= 0; j--)
{
s[j] += s[j] - '0' + carry;

carry = (s[j] > '9');

if (carry)
{
s[j] -= 10;
}
}
}

while ((p[0] == '0') && (p < &s[sizeof(s) - 2]))
{
p++;
}

return p;
}

int main(void)
{
static const uint32 testData[][4] =
{
{ 0, 0, 0, 0 },
{ 1048576, 0, 0, 0 },
{ 0xFFFFFFFF, 0, 0, 0 },
{ 0, 1, 0, 0 },
{ 0x12345678, 0x90abcdef, 0xfedcba90, 0x8765421 }
};
printf("%s\n", Bin128ToDec(testData[0]));
printf("%s\n", Bin128ToDec(testData[1]));
printf("%s\n", Bin128ToDec(testData[2]));
printf("%s\n", Bin128ToDec(testData[3]));
printf("%s\n", Bin128ToDec(testData[4]));
return 0;
}

输出:

0
1048576
4294967295
4294967296
11248221411398543556294285637029484152

关于c - 如何在 C 中将 128 位整数转换为十进制 ascii 字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47653086/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com