12

私は最初の C++ クラスを受講しており、文字を 16 進表現とバイナリの間で変換したいと考えています。次を使用して、16進数を印刷できます。

for(char c = 'a'; c <= 'z'; c++){
    cout << hex << (int)c;
}

しかし、バイナリに対して同じことはできません。std::bin10 進数を 2 進数に変換するために使用できるものはありません。

4

6 に答える 6

49

そのようです:

for(char c = 'a'; c <= 'z'; c++){
        std::bitset<sizeof(char) * CHAR_BIT> binary(c); //sizeof() returns bytes, not bits!
        std::cout << "Letter: " << c << "\t";
        std::cout << "Hex: " << std::hex << (int)c << "\t";
        std::cout << "Binary: " << binary << std::endl;
    }
于 2009-01-27T14:43:23.957 に答える
5

C++にはバイナリIOマニピュレータはありません。おそらくビットシフト演算子を使用して、手動でカバーを実行する必要があります。実際の変換は難しい作業ではないので、C ++の初心者の能力の範囲内である必要があります(標準ライブラリに含まれていないという事実はそうではないかもしれません:))

編集:他の多くの人が例を挙げているので、私は私の好みの方法を与えるつもりです

void OutputBinary(std::ostream& out, char character)
{
  for (int i = sizeof(character) - 1; i >= 0; --i)
  {
    out << (character >> i) & 1;
  }
}

これは、任意の数値タイプにテンプレート化される可能性もあります。

于 2009-01-27T14:35:30.493 に答える
4

少し多様性がある場合は、16要素のルックアップテーブルを使用して行うこともできます。

于 2009-01-27T14:39:30.827 に答える
2

16進文字とそのバイナリ「ニブル」の間のマッピングを簡単に記述できます。

std::string HexCharToNibble( char c ) {
switch (c) {
  case '0': return "0000";
  case '1': return "0001";
  //... fill in the rest
  case 'f': return "1111";
  default: assert(false); return "bad input";
};
于 2009-01-27T14:39:52.700 に答える
1

あなたはこのようなことをすることができます:

for(char c = 'a'; c <= 'z'; c++){
    // char is 8 bits.  print 4 bits
    // at a time, starting with the MSB
    for (int i = 4; i>=0; i-=4) {
        switch (((int)c >> i) & 0xf) {
            case 0:
                cout << "0000";
                break;
            case 1:
                cout << "0001";
                break;
            .
            .
            .
            case 0xf:
                cout << "1111";
                break;


        }
    }
}
于 2009-01-27T14:39:45.103 に答える
0

これは課題のように聞こえますが、その場合は本当に先生に助けを求める必要があります. 宿題の解決策をインターネットで求めても、長期的には役に立ちません (プロジェクト管理を行う場合を除きます)。

コメントでchustar(OQ'er)に答えると、それを行う方法、それがどのように/なぜ機能するか、そして将来自分でそれを理解する方法を理解しているなら、そうです、それは良いこと。

しかし、彼が「正しい」とマークした答えは、その議論に嘘をつきます。「Like so」という言葉で始まるコードだけが含まれています。OQ'er が探していたのは説明ではなく、誰かが彼のためにコードを書いてくれることだったことは明らかです。

于 2009-01-27T14:51:26.233 に答える