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'or'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 に答える