注:元の質問に情報が不足しているため、この回答は大幅に編集されています。このバージョンの回答は、十分な情報を含む更新された質問に基づいています。履歴については、編集ログを確認してください。
2つのこと:
&&
ブール式の間で使用され、論理 AND 値を決定します
^
C# では、累乗ではなく、XOR を意味します。あなたはこれについて質問しませんでしたが^
、その仕事をしていないように見えることを発見したことは避けられませんでした.
は、コンテキストに応じて二重の意味を持つ&&
単一の代わりに置き換えることができるため、簡単に処理できます。&
完全評価の論理 AND 演算子 (&&
は短絡演算子) であるか、ここで必要なビット単位の演算子です。
は^
違いますが。最も直接的な同等物はMath.Powですが、この場合、より良い代替手段であるビットシフトを使用できます。
の場合は、1 ビットの X 位置を左にシフトする2^X
と考えることができ、左へのビットのシフトには独自の演算子、演算子があります。<<
2^X
と交換できるので1 << X
。
このコンテキストでは、最も内側の if ステートメントに必要なものは次のとおりです。
if ((intNumber & (1 << index)) != 0)
a = a + "1";
else
a = a + "0";
一番下の例のようにループにプラグインすると、次のようになります。
for (Int32 index = 7; index >= 0; index--)
if ((intNumber & (1 << index)) != 0)
bin = bin + "1";
else
bin = bin + "0";
現在、このように文字列を連結すると GC プレッシャーが発生するため、これらの数字をChar
配列に格納し、後で文字列を作成するか、StringBuilder クラスを使用する必要があります。それ以外の場合は、(私の例から) 異なるサイズの文字列を 8 つ作成し、最後の文字列のみを使用して保持することになります。状況によっては問題にならない場合もありますが、このコードを何度も呼び出すと、問題が発生します。
最終的なコードのより良いバージョンは次のとおりです。
Char[] digits = new Char[8]; // change if you want more/fewer digits
for (Int32 index = 0; index < digits.Length; index++)
if ((intNumber & (1 << index)) != 0)
digits[digits.Length - 1 - index] = '1';
else
digits[digits.Length - 1 - index] = '0';
bin = new String(digits);
ただし、ここにキッカーがあります。.NET には、Int32 値を 2 進数でいっぱいの文字列に変換する方法が既にあり、それが Convert.ToString メソッドです。唯一の違いは、先行ゼロを追加しないことです。そのため、自分で行う必要があります。
したがって、使用する必要がある最終的なコードは次のとおりです。
String bin = Convert.ToString(intNumber, 2).PadLeft(8, '0');
これはループ全体を置き換えます。