-1

整数を同等のバイナリ表現に変換しようとしていました。

次のアルゴリズムを使用していました

void decimal_to_binary(uint32_t number)
{
    char bitset[32];
    for(uint32_t i=0; i<32; ++i)
    {
        if((number & (1 << i)) != 0)
        {
            bitset[31-i] = '1';
        }
        else
        {
            bitset[31-i] = '0';
        }
    }
    for(uint32_t i=0; i<32; ++i)                                                                                                               
    {
        cout << bitset[i];
    }
    cout << "\n";
}

たとえば、 uint32_t として宣言された「5」に対してこの関数を実行すると、正しい結果が得られます

decimal_to_binary(5)
00000000000000000000000000000101

しかし、数値を uint64_t として宣言し、ビットセットのサイズを 64 ビットに変更すると、結果はまったく異なります

同じことをするコードを追加する

void decimal_to_binary(uint64_t number)
{
    char bitset[64];
    for(uint64_t i=0; i<64; ++i)
    {
        if((number & (1 << i)) != 0)
        {
            bitset[63-i] = '1';
        }
        else
        {
            bitset[63-i] = '0';
        }
    }
    for(uint64_t i=0; i<64; ++i)
    {
        cout << bitset[i];
    }
    cout << "\n";
}

decimal_to_binary(5)
0000000000000000000000000000010100000000000000000000000000000101

uint32 で取得した結果と同じ結果が表示されますが、一方が他方の横に配置されています。

これは、uint64_t が CPP のようなプログラミング言語でどのように実装されているのか疑問に思いました??

stdintヘッダー ファイルを調べて詳細を取得しようとしましたが、そこにあるリンクが非常に役立ちました。

お時間をいただきありがとうございます。

4

3 に答える 3

3

64 ビット コードの (1 << i) は、1 に通常の 32 ビット int を使用している可能性があります。 (デフォルトのワード サイズ)

したがって、1 は完全にシフトアウトされます。ただし、これがあなたが提供した出力をどのように生成するかわかりません:)

定数には 1ull を使用します (unsigned long long)

于 2014-04-15T14:36:33.757 に答える
2

問題は次の行にあります。

if((number & (1 << i)) != 0)

演算子の<<戻り値の型は左オペランドの型であり、実装上では明らかに 32 ビット長であると想定されています。型をそのビットの総数よりもさらにシフトすると、未定義の動作が発生します。

それを修正するには

if((number & (static_cast<uint64_t>(1) << i)) != 0) 
于 2014-04-15T14:41:59.873 に答える