2009-06-16 17 views
1

Ich habe einige alte Code wie folgt aus:Bitverschiebung Verwirrung in C#

private int ParseByte(byte theByte) 
{ 
     byte[] bytes = new byte[1]; 
     bytes[0] = theByte; 
     BitArray bits = new BitArray(bytes); 

     if (bits[0]) 
      return 1; 
     else 
      return 0; 
} 

Es ist lang und ich dachte, ich es so nach unten trimmen könnte:

private int ParseByte(byte theByte) 
{ 
     return theByte >> 7; 
} 

Aber ich bin nicht immer die gleichen Werte wie die erste Funktion. Das Byte enthält entweder 00000000 oder 10000000. Was fehlt mir hier? Benutze ich einen falschen Operator?

Antwort

4

Das Problem ist, dass in der ersten Funktion Bits [0] das niedrigstwertige Bit zurückgibt, aber die zweite Funktion das höchstwertige Bit zurückgibt. Um die zweite Funktion zu ändern, um das niedrigstwertige Bit zu erhalten:

private int ParseByte(byte theByte) 
{ 
    return theByte & 00000001; 
} 

die erste Funktion zum Ändern des höchstwertigen Bits zurückzukehren, sollten Sie Bits verwenden [7] - nicht Bits [0].

+0

so, der Hex-Editor, den ich verwendet habe, um die angezeigten Daten als 10000000 zu betrachten. Ich schätze, es zeigte zuerst die LSB? und ich hatte Glück mit meiner Verwirrung im BitArray? – scottm

+0

@ scott2012: Ich kann nicht für Ihren Hex-Editor sprechen, aber so funktioniert BitArray - das niedrigstwertige Bit ist bei Index 0. Sie können dies mit einem kurzen Codecode verifizieren: var bits = new BitArray (neues Byte [] {0xf0}); // 11110000 für (int idx = 0; idx <= 7; idx ++) Console.WriteLine ("{0}: {1}", idx, Bits [idx]); –

0

Vielleicht sollte die erste Funktion nach Bits [7] suchen?

+0

Die erste Funktion bekommt, was ich will, die zweite funktioniert nicht. – scottm

+0

funktioniert die folgende Arbeit: return ((int) theByte == 128)? 1: 0; –

0

Sie haben eine zusätzliche Null in Ihren Binärzahlen (Sie haben jeweils 9 Ziffern). Ich nehme an, das ist nur ein Tippfehler.

Sind Sie sicher, dass Sie Ihre Bestellung korrekt ausführen? Binär wird traditionell von rechts nach links und nicht von links nach rechts geschrieben wie die meisten anderen Nummerierungssysteme. Wenn die angezeigte Binärzahl Eigenschaft formatiert ist (was bedeutet, dass 10000000 ist wirklich die Nummer 128 und nicht die Nummer 1) dann sollte Ihr erstes Code-Snippet nicht funktionieren und die zweite sollte. Wenn Sie es rückwärts schreiben (dh 10000000 ist 1, nicht 128), dann brauchen Sie nicht einmal Bitshift. Just UND es mit 1 (theByte & 1).

In der Tat scheint, unabhängig von der Vorgehensweise ein bitweises UND (&-Operator) geeigneter zu sein. Da Ihre erste Funktion funktioniert und die zweite nicht, gehe ich davon aus, dass Sie die Nummer einfach rückwärts geschrieben haben und wie oben beschrieben mit 1 UND verknüpfen müssen.

+0

wurde der Tippfehler behoben. Ich schreibe es nicht rückwärts, es ist ein Format für einige Binärdaten, die ich gerade lese. Ich weiß nicht, warum es so gemacht wurde. Ich werde versuchen & obwohl – scottm

0

Laut einem Benutzer auf Microsoft's site speichert das BitArray intern die Bits in Int32s in Big-Endian in Bit-Reihenfolge. Das könnte das Problem verursachen. Für eine Lösung und weitere Informationen können Sie den Link besuchen.

3

Die äquivalente Funktion zur ersten snipet ist:

return theByte & 1 == 1 

Im zweiten snipet Sie die significative Bit chechink wurden und in der ersten snipet des am wenigsten signifikant.

0

1. Die erste Funktion funktioniert nicht, da sie versucht, eine Zeichenfolge anstelle eines int zurückzugeben.

Aber was Sie vielleicht wollen, ist dies:

private static int ParseByte(byte theByte) 
    { 
     return theByte & 1; 
    } 

jedoch auch dies wünschen konnte:

private static string ParseByteB(byte theByte) 
    { 
     return (theByte & 1).ToString(); 
    } 
+0

Der Tippfehler wurde korrigiert – scottm

1

Haben Sie int oder String zurückkehren wollen? Wie auch immer - Sie können modulo verwenden:

return theByte % 2 == 0 ? "0" : "1" 

OK, Sie bearbeitet ...und wollen zurückgeben int

Ein Wort zu Ihrer Verschiebung Operation: Sie müssten < < anstelle von >> verwenden. Aber das gibt (wenn man anstelle von int Byte gießt) 0 oder 128 und nicht 0 oder 1. So könnten Sie Ihre zweite Lösung umschreiben als:

return (byte)(theByte << 7) == 128 ? 1 : 0; 

Aber auch die anderen Antworten enthalten wirklich bessere Lösungen als diese.