簡體   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