Frage

Ich habe diesen If Zustand in VB6

If ( X AND ( 2 ^ Y)) Then 
  a = a + " 1" 
Else
  a = a + " 0" 

Ich möchte das gleiche Äquivalent in C #

Ich habe versucht zu tun, wie

if ( X && ( 2 ^ Y))   // ERROR: && can not be used between int to int
  a = a + "1";
else
  a = a + "0";

aber dieses Ding mir einen Fehler gibt.

Hier ist meine komplette VB Code, den ich in C # konvertieren möchten

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

In obigen Code intNumber könnte eine beliebige Zahl sein.

War es hilfreich?

Lösung

Hinweis : Diese Antwort stark bearbeitet wurde in ursprünglicher Frage zu Mangel an Informationen durch. Diese Version der Antwort wird nun auf die aktualisierte Frage mit genügend Informationen. Für Geschichte, überprüfen Sie das Bearbeitungsprotokoll.

Zwei Dinge:

  • && zwischen Booleschen Ausdrücken verwendet wird, den logischen UND-Wert zu bestimmen
  • ^ in C # bedeutet, XOR, nicht Raised-to-the-Power-of. Sie haben keine Frage dazu stellen, aber es war unvermeidlich, dass Sie entdeckt, dass ^ nicht seine Aufgabe zu haben scheinen zu tun.

Die && ist leicht zu handhaben, da sie stattdessen mit einem einzigen & ersetzt werden kann, die eine doppelte Bedeutung hat, je nach Kontext. Entweder es ist eine Full-Auswertung logischen AND-Operator (&& ist ein Kurzschluss ein), oder es ist ein Bit-Operator, das ist das, was Sie hier wollen.

Die ^ ist aber anders. Der direkteste entspricht Math.Pow , aber in diesem Fall eine bessere Alternative zur Verfügung steht, Bit-Verschiebung.

Der Fall 2^X kann man sich als verschieben die 1-Bit-X-Positionen nach links und Verschiebung Bits nach links hat einen eigenen Betreiber, der << Operator.

So 2^X mit 1 << X ersetzt werden.

In diesem Zusammenhang ist hier, was Sie für Ihre inner meist if-Anweisung:

if ((intNumber & (1 << index)) != 0)
    a = a + "1";
else
    a = a + "0";

Schließen Sie, dass in einer Schleife wie Sie in Ihrem unteren Beispiel, und Sie diese:

for (Int32 index = 7; index >= 0; index--)
    if ((intNumber & (1 << index)) != 0)
        bin = bin + "1";
    else
        bin = bin + "0";

Nun Strings wie diese verketten erzeugt GC Druck, so dass Sie wahrscheinlich entweder diese Ziffern in eine Char Array gespeichert werden sollen, und konstruieren die Zeichenfolge danach, oder die Stringbuilder-Klasse verwenden. Sonst wirst du 8 aufzubauen (aus meinem Beispiel) unterschiedlich großen Strings, und du bist nur die letzten zu verwenden und weiterzumachen. Je nach den Umständen kann dies kein Problem dar, aber wenn Sie diesen Code oft nennen, wird es addieren.

Hier ist eine bessere Version des endgültigen Code:

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

Allerdings, und hier ist der Kicker. Es gibt bereits einen Weg, um einen Int32-Wert in einen String voller Binärzahlen in .NET zu konvertieren, und es ist die Convert.ToString Methode. Der einzige Unterschied ist, dass es keine führende Nullen hinzufügt, so haben wir das selbst tun.

So, hier ist der letzte Code, den Sie verwenden sollten:

String bin = Convert.ToString(intNumber, 2).PadLeft(8, '0');

Dies ersetzt die ganze Schleife.

Andere Tipps

Es sieht aus wie es VB verwendet bitweise und in diesem Fall zu tun, also vielleicht:

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

Dies ist jedoch eine Konstante! Sind Sie sicher, dass es dort irgendwo keine Variable ist?

2 ^ 1 3 ist; 1 und 3 ist 1; so würde dies immer der Fall sein

(zumindest unter C #, wo ^ ist XOR, mir gesagt, dass in VB ^ POWER ist, so 2 ^ 1 2; 1 & 2 ist 0, so wäre dies immer falsch sein ...)

Ich habe nicht die bedingte Syntax verstehen ... Meinst du 1 & (2 ^ 1))? (Verwenden Sie nur eine Et-Zeichen für bitweise Vergleiche!) (Das ist aber konstant!)

aber wenn ein ein String ist,  dann

 a +=  Conditional?  "1": "0";

Versuchen

if ( 1 & ( 2 ^ 1))
  a = a + "1";
else
  a= a+ "0";

Verwenden Sie nicht den Kurzschluss und. Versuchen Sie folgendes:

if (1 & (2 ^ 1) == 1)
{
    a = a + "1";
}
else
{
    a = a + "0";
}

Ihr Beitrag macht überhaupt keinen Sinn:

IF ( 1 AND ( 2 ^ 1)) Then 
 a = a + " 1" 
Else
  a = a + " 0"

2 ^ 1 = 2 = Math.Pow (2,1) 1 und 2 = 1 & 2 = 0

Das bedeutet Logik, dass das Ergebnis der, wenn immer Null sein.

Wenn ich das richtig verstehen, was Sie tun möchten, ist in einer Schleife tun

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

in diesem Fall wäre es besser, wenn du gerade geschrieben

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

auch für String concaternation in Schleife sollten Sie Stringbuilder-Klasse nicht Operator + verwenden.

Nur als Referenz, eine kurze Version von Lass endgültigen Code:

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

Grundsätzlich nimmt dieser Vorteil von der Tatsache, dass wir genauso einfach die Zahl nach rechts verschieben, wie die Maske links verschieben. Wenn wir die Dinge auf diese Weise zu tun, ist das Ergebnis der UND-Operation ist immer die Einerstelle, die die gleiche Ziffer in unserem String wollen, so dass wir es nur zu einem ASCII-Zeichen konvertieren, indem das Hinzufügen ‚0‘ (oder 48 oder 0x30) .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top