2

If私はVB6でこの状態を持っています

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では、任意の数にすることができます。

4

8 に答える 8

15

:元の質問に情報が不足しているため、この回答は大幅に編集されています。このバージョンの回答は、十分な情報を含む更新された質問に基づいています。履歴については、編集ログを確認してください。

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');

これはループ全体を置き換えます。

于 2008-12-30T14:50:23.463 に答える
3

この場合、VB を使用してビットごとの AND を実行しているように見えるので、おそらく次のようになります。

if ( (1 & ( 2 ^ 1)) != 0)

しかし、これは定数です!どこかに変数がないと確信していますか?

2 ^ 1 は 3 です。1 & 3 は 1 です。だからこれは常に真実だろう

(少なくとも、C# では ^ は XOR です。VB では ^ は POWER であると言われているので、2 ^ 1 は 2 です。1 & 2 は 0 です。したがって、これは常に false になります...)

于 2008-12-30T14:50:33.433 に答える
1

条件構文がわかりません... 1 & ( 2 ^ 1)) のことですか? (ビットごとの比較にはアンパサンドを 1 つだけ使用してください!) (ただし、これは定数です!)

ただし、a が文字列の場合、

 a +=  Conditional?  "1": "0";
于 2008-12-30T14:51:34.977 に答える
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 の結果が常にゼロになることを意味します。

于 2008-12-30T15:28:48.787 に答える
0

試す

if ( 1 & ( 2 ^ 1))
  a = a + "1";
else
  a= a+ "0";
于 2008-12-30T14:49:10.253 に答える
0

参考までに、ラッセの最終的なコードのより簡潔なバージョン:

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 文字に変換するだけです。 .

于 2010-12-12T20:17:57.973 に答える
0

短絡および短絡は使用しないでください。これを試して:

if (1 & (2 ^ 1) == 1)
{
    a = a + "1";
}
else
{
    a = a + "0";
}
于 2008-12-30T14:49:47.820 に答える
0

あなたがやりたいことを正しく理解していれば、ループで実行します

if i is even
a = a + "0"
else
a = a+"1"

この場合、単に書いた方が良いでしょう

for (int i=7;i>=0;i--)
{
   bin+=(i % 2).ToString();
}

また、ループ内の文字列連結には、+ 演算子ではなく StringBuilder クラスを使用する必要があります。

于 2008-12-30T17:46:34.513 に答える