我必须在参数中取一个80位的整数,将其转换为二进制,然后对其进行一些位移操作。我使用这个片段(似乎工作正常)来存储参数:
uint64_t n;
seed= strtol(argv[1], &p, 10);
printf("n:%" PRIu64 "\n", n);
然后,我想使用此函数将其转换为二进制文件:
uint64_t decimal_binary(uint64_t n)
{
uint64_t rem, i=1;
uint64_t binary=0;
while (n!=0)
{
rem=n%2;
n/=2;
binary+=rem*i;
i*=10;
}
return binary;
}
但是:
printf("n:%" PRIu64 "\n", n); /* works fine, even for n >= 1048576 */
printf("n:%" PRIu64 "\n", decimal_binary(n)); /* works only for n <= 1048575 */
我需要使用位移操作符,因此我需要一个适用于<<
的解决方案。
答案 0 :(得分:1)
8字节整数不足以存储80位数的二进制格式。请考虑使用char数组。
如果数字为3,则二进制格式为11(2位)。如果数字是255,则二进制数是11111111(8位)。所以我认为当数字大于1048575时,你必须使用超过21位数来存储它。它大于8字节的最大值。
答案 1 :(得分:1)
你的decimal_binary
可以接受一个struct wrapped uint8_t [10]
数组(如果你想省略一些用指针检查的边界)和一个指向输出缓冲区的指针。将80位整数作为MSB排列到数组中,然后逐位循环遍历每个字节并将'0'
或'1'
写入输出,例如
typedef struct { uint8_t arr[10]; } S_big_integer_container;
void decimal_binary( S_big_integer_container bigUInt, char *output[81] )
{
uint32_t i, j;
uint32_t iOut = 0u;
for ( i=0u; i<10u; i++ )
{
for ( j=0u; j<8u; j++)
{
char o = ( bigUInt.arr[i] & (0x80u >> j) ) ? '1' : '0';
(*output)[iOut++] = o;
}
}
(*output)[80] = '\0';
}
现在输出数组中有一个80位的二进制字符串,很容易打印。如果要省略前导零,则需要进行一些修改。 Example here