C#の「IF(X AND(2 ^ Y))Then」と同等
-
03-07-2019 - |
質問
VB6にこのIf
条件があります
If ( X AND ( 2 ^ Y)) Then
a = a + " 1"
Else
a = a + " 0"
C#でも同じものが欲しい
次のようにしてみました
if ( X && ( 2 ^ Y)) // ERROR: && can not be used between int to int
a = a + "1";
else
a = a + "0";
しかし、これは私にエラーを与えています。
これは、C#に変換する完全なVBコードです
For i = 7 To 0 Step -1
If intNumber And (2 ^ i) Then ' Use the logical "AND" operator.
bin = bin + "1"
Else
bin = bin + "0"
End If
Next
上記のコードでは、intNumber
は任意の数字にすることができます。
解決
注:この回答は、元の質問に情報がないために大幅に編集されています。このバージョンの回答は、更新された質問と十分な情報に基づいています。履歴については、編集ログを確認してください。
2つのこと:
-
&&
はブール式の間で使用され、論理AND値を決定します
C#の -
^
は、累乗ではなくXORを意味します。あなたはこれについて質問しませんでしたが、&
がその仕事をしているようには見えなかったことを発見することは避けられませんでした。
2^X
は、コンテキストに応じて二重の意味を持つ単一の<<
に置き換えることができるため、簡単に処理できます。完全評価の論理AND演算子(1 << X
はショートサーキット演算子)、またはビット単位の演算子です。これがここで必要なものです。
ただし、Char
は異なります。最も直接的な同等物は Math.Pow ですが、この場合、より良い代替手段であるビットシフトが利用可能です。
<=>の場合は、 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の圧力が発生するため、これらの数字を<=>配列に格納してから文字列を作成するか、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);
しかし、ここにキッカーがいます。 Int32値を.NETの2進数でいっぱいの文字列に変換する方法は既にあり、それはConvert.ToStringメソッドです。唯一の違いは、先行ゼロが追加されないことです。したがって、それを自分で行う必要があります。
だから、これがあなたが使うべき最終的なコードです:
String bin = Convert.ToString(intNumber, 2).PadLeft(8, '0');
これはループ全体を置き換えます。
他のヒント
VBを使用してビット単位のANDを実行しているように見えるため、おそらく:
if ( (1 & ( 2 ^ 1)) != 0)
ただし、これは定数です!どこかに変数がないのは確かですか?
2 ^ 1は3です。 1 <!>アンプ; 3は1です。これは常に真実です
(少なくとも、C#では、^はXORです。VBでは^がPOWERであるため、2 ^ 1は2です。1<!> amp; 2は0です。したがって、これは常にfalseです。 ..)
条件付き構文が理解できません... 1 <!> amp; (2 ^ 1))? (ビットごとの比較にはアンパサンドを1つだけ使用してください!)(ただし、これは一定です!)
ただし、aが文字列の場合、
a += Conditional? "1": "0";
試用
if ( 1 & ( 2 ^ 1))
a = a + "1";
else
a= a+ "0";
短絡回路を使用しないでください。これを試してください:
if (1 & (2 ^ 1) == 1)
{
a = a + "1";
}
else
{
a = a + "0";
}
あなたの投稿はまったく意味がありません:
IF ( 1 AND ( 2 ^ 1)) Then
a = a + " 1"
Else
a = a + " 0"
2 ^ 1 = 2 = Math.Pow(2,1) 1 AND 2 = 1 <!>アンプ; 2 = 0
このロジックは、ifの結果が常にゼロになることを意味します。
あなたが何をしたいのかを正しく理解しているなら、ループで行う
if i is even
a = a + "0"
else
a = a+"1"
この場合、書いた方が良いでしょう
for (int i=7;i>=0;i--)
{
bin+=(i % 2).ToString();
}
ループ内の文字列連結にも、+演算子ではなくStringBuilderクラスを使用する必要があります。
参考までに、ラッセの最終コードのより簡潔なバージョン:
Char[] digits = new Char[8]; // change if you want more/fewer digits
int index = digits.Length;
var x = intNumber;
do {
digits[--index] = '0' + (x & 1);
x >>= 1;
} while (index);
bin = new String(digits);
基本的に、これはマスクを左にシフトするのと同じくらい簡単に右にシフトできるという事実を利用しています。そのように処理すると、AND演算の結果は常に1桁になります。これは文字列に必要な数字と同じなので、 '0'(または48または0x30)を追加してASCII文字に変換するだけです。 。