C# におけるバイナリ値の保存と表示
[[academy-video-youtube({"vid": "xkZa6IyqNwg", "start_time": "0", "title": "C# のバイナリ値の保存と表示", "creator": "Tim Corey", "length": "9m 20s"})]]
バイナリはコンピュータが実際にデータを格納し処理する方法ですが、C#は画面上に表示されるものに基数10をデフォルトとして使用します。 ビットフラグ、ネットワークプロトコル、ハードウェアレジスタを扱っている場合、または数値が機械レベルでどのように表されているかを理解しようとしている場合は、C#にバイナリ値を入力し、それを読みやすい形式で表示する方法を知る必要があります。
彼のビデオ"C#でのバイナリ値の保存と表示"で、Tim Coreyはバイナリシリーズの3つ目のレッスンをカバーします。 彼はどのように0bプレフィックスを使用してバイナリリテラルを保存するか、Convert.ToString() を使用してどのように整数をバイナリ文字列表現に変換するか、そしてクリーンなフォーマットのために先頭にゼロを追加する方法を示します。 バイナリシリーズをフォローしている場合、またはC#で低レベルのデータを操作している場合、これは実践的なメカニズムをカバーしています。
バイナリリテラルの保存:C#にて
[0:00 - 1:50] Timが最初に取り上げる質問はシンプルです:C#変数にバイナリ数をどのように入れるのですか? 答えは0bプレフィックスです。これがコンパイラに数字を基数2として解釈するよう指示します。
// Store binary 1001 (which is 9 in decimal)
int binaryValue = 0b1001;// Store binary 1001 (which is 9 in decimal)
int binaryValue = 0b1001;プレフィックスがないと、1001は千一として解釈されます。 0bを使用すると、それが4つのバイナリ桁として扱われ、10進数値9を表します。先行ゼロはオプションです。 0b00001001と書くことは0b1001と同一ですが、特定のビット幅を扱う際にビット位置を読みやすくするために長い形式を使用できます。
変数タイプは標準のintです。 負数が必要ない場合は符号なし整数(uint)を使用してもよいですし、64ビットストレージにはlongを使えます。 バイナリリテラル構文は、整数型のすべてで機能します。
バイナリでの数値表示
[1:50 - 3:48] バイナリ値を保存することは一つのことですが。 それを画面でバイナリとして見ることは別のことです。 整数を Console.WriteLine で印刷すると、C# は基数10の表現を出力します。 0b1001の場合、それは9を表示し、1001ではありません。
バイナリ文字列表現を取得するには、基数パラメータ付きの Convert.ToString() を使用します。
int binaryValue = 0b1001;
// Convert to binary string (base 2)
string representation = Convert.ToString(binaryValue, 2);
Console.WriteLine($"Base 10: {binaryValue}"); // Output: 9
Console.WriteLine($"Base 2: {representation}"); // Output: 1001int binaryValue = 0b1001;
// Convert to binary string (base 2)
string representation = Convert.ToString(binaryValue, 2);
Console.WriteLine($"Base 10: {binaryValue}"); // Output: 9
Console.WriteLine($"Base 2: {representation}"); // Output: 1001出力の基数を指定するために Convert.ToString() の第2引数を使用します。 サポートされている値は、2(バイナリ)、8(八進数)、10(十進数)、16(十六進数)です。 Timは基数2を実演しますが、同じメソッドがこれらすべてに対応しています。
先行ゼロでの埋め込み
[3:48 - 5:24] Convert.ToString(binaryValue, 2)の生の出力は先頭のゼロを省略します。 0b1001の場合、結果は文字列"1001"であり、"00001001"ではありません。 バイト(8ビット)や16ビットの値、32ビットのレジスタを扱っている場合、フル幅を先行ゼロで見ると、ビット位置が即座にわかりやすくなります。
修正は PadLeft() です。
// Pad to 8 characters (one byte) with leading zeros
string padded = Convert.ToString(binaryValue, 2).PadLeft(8, '0');
Console.WriteLine(padded); // Output: 00001001// Pad to 8 characters (one byte) with leading zeros
string padded = Convert.ToString(binaryValue, 2).PadLeft(8, '0');
Console.WriteLine(padded); // Output: 00001001PadLeft(8, '0') は出力を少なくとも8文字にし、左側に欠けている位置を文字 '0' で埋めます。 Timは、第二引数が文字(シングルクオート)であり、文字列ではないという詳細に注目しています。 それは数字のゼロではなく文字のゼロです。なぜなら PadLeft は個々の文字から文字列を作成するからです。
16ビットの表現には、8を16に変更します。完全な32ビット整数には、32を使用します。このパディング幅は、あなたが考慮しているビット幅に一致するべきです。
整数をバイナリに変換する方法
[5:24 - 7:28] Timが見落としやすい点を押さえます:バイナリ表現を見るためにバイナリリテラルとして値を保存する必要はありません。 同じ Convert.ToString() アプローチを使用して、任意の整数をバイナリ出力に変換できます。
// A regular base 10 integer
int decimalValue = 12;
// Convert to padded binary string
string binary = Convert.ToString(decimalValue, 2).PadLeft(8, '0');
Console.WriteLine($"Decimal: {decimalValue}"); // Output: 12
Console.WriteLine($"Binary: {binary}"); // Output: 00001100// A regular base 10 integer
int decimalValue = 12;
// Convert to padded binary string
string binary = Convert.ToString(decimalValue, 2).PadLeft(8, '0');
Console.WriteLine($"Decimal: {decimalValue}"); // Output: 12
Console.WriteLine($"Binary: {binary}"); // Output: 000011000bプレフィックスは、既にバイナリ値があり、それをバイナリ形式で入力したい場合に使用します。 通常の整数には、Convert.ToString() が変換を処理します。 同じ基になる値に対して両方のパスは同じ結果を生成します。
C#がメモリ内で整数を保存する方法
[7:28 - 9:20] Timは、C#が内部的に整数を保存する方法についての詳細で締めくくります。 C#におけるintはSystem.Int32の別名で、32ビットの符号付き整数です。 それは、値がどれだけ小さくても、すべてのintがメモリ内で32ビットを占有することを意味します。 0b1001(数値9)を保存するには、0b01111111111111111111111111111111(20億を超える)を保存するのと同じ32ビットが使用されます。
// What's actually stored in memory for binaryValue = 0b1001
// 00000000 00000000 00000000 00001001
string fullRepresentation = Convert.ToString(binaryValue, 2).PadLeft(32, '0');
Console.WriteLine(fullRepresentation);// What's actually stored in memory for binaryValue = 0b1001
// 00000000 00000000 00000000 00001001
string fullRepresentation = Convert.ToString(binaryValue, 2).PadLeft(32, '0');
Console.WriteLine(fullRepresentation);これは、適切な型サイズの選択 が重要である理由とつながっています。 long(Int64)は64ビットを使用し、メモリのフットプリントが倍増します。 ほとんどのアプリケーションでは、int(32ビット)が必要な範囲をカバーします。 しかし、メモリが制約されている環境で作業しているか、何百万もの値を処理している場合には、バイト(8ビット)、ショート(16ビット)、int(32ビット)、およびlong(64ビット)の違いが重要になります。
まとめ: 完全なパターン
[9:07 - 9:15] C#でバイナリを扱う際の完全なパターンは簡潔です。バイナリ入力がある場合は、0bプレフィックスを使用して値を保存します。 生の出力を表示するには Convert.ToString(value, 2) を使用します。 固定幅のフォーマットが必要な場合には .PadLeft(width, '0') を追加します。 そして、基盤のストレージは常に標準的な整数型であり、ビット幅は、byte、short、int、またはlongを選ぶかどうかによって決まります。
結論
[9:15 - 9:20] 要点をまとめると、バイナリリテラルは0bプレフィックスを使用し、Convert.ToString(value, 2) はバイナリ文字列を生成し、PadLeft() は固定幅表示のために先頭にゼロを追加します。 値は内部で通常の整数型に格納され、数の大きさに関係なく、intは常に32ビットを占有します。
これらの構成要素は、シリーズの次のレッスンで現れ、ビット演算のためにバイナリ値が適切にフォーマットされる必要があります。
例のヒント: ビット演算をデバッグする際には、バイナリ出力をタイプの全幅に埋めてください(バイトの場合は8、ショートの場合は16、イントの場合は32)。 すべてのビット位置を一度に見ることで、シフトやマスク操作が非常に簡単にトレースできます。 string ToBinary(int val) => Convert.ToString(val, 2).PadLeft(32, '0'); のようなヘルパーメソッドによって繰り返しの入力を節約します。

