繁体   English   中英

大量二进制

[英]Large number in binary

我必须在参数中使用一个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 */

我将需要使用位移运算符,因此我需要一个可以与<<一起使用的解决方案。

8个字节的整数不足以存储80位数字的二进制格式。 请考虑使用char数组。

例如,如果数字为3,则其二进制格式为11(2位数字)。 如果数字为255,则二进制数字为11111111(8位数字)。 因此,我认为当数字大于1048575时,必须使用21位以上的数字进行存储。 它大于8个字节的最大值。

您的decimal_binary可以采用结构包装的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位的二进制字符串,该字符串易于打印。 如果要省略前导零,则需要进行一些修改。 这里的例子

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM