0

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

我将需要使用位移运算符,所以我需要一个可以与<<.

4

2 回答 2

1

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 位的二进制字符串,很容易打印。如果要省略前导零,则需要进行一些修改。这里的例子

于 2015-11-26T16:32:33.547 回答
1

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

例如,如果数字是 3,它的二进制格式是 11(2 位)。如果数字为 255,则二进制数为 11111111(8 位)。所以我认为当数字大于 1048575 时,你必须使用超过 21 位来存储它。它大于最大 8 字节数。

于 2015-11-26T15:31:46.563 回答