C # Sprache: Ändern der ersten vier Bits in einem Byte

8

Um ein Byte voll auszunutzen, versuche ich zwei eindeutige Werte in einem Byte zu speichern: eins in den ersten vier Bits und eins in den zweiten vier Bits. Ich habe jedoch festgestellt, dass, obwohl diese Praxis eine optimierte Speicherzuweisung ermöglicht, es schwierig macht, die einzelnen in dem Byte gespeicherten Werte zu ändern.

In meinem Code möchte ich den ersten Satz von vier Bits in einem Byte ändern, während der Wert der zweiten vier Bits im selben Byte beibehalten wird. Während bitweise Operationen mir erlauben, die ersten vier Bitwerte leicht zu finden und zu manipulieren, finde ich es schwierig, diesen neuen Wert mit dem zweiten Satz von vier Bits in einem Byte zu verketten. Die Frage ist, wie kann ich die ersten vier Bits von einem Byte löschen (oder, genauer gesagt, setze sie alle auf Null) und füge den neuen Satz von 4 Bits hinzu, um die vier gerade gelöschten Bits zu ersetzen und so die letzten 4 zu erhalten Bits in einem Byte beim Ändern der ersten vier?

Hier ist ein Beispiel:

%Vor%     
churay 16.07.2011, 19:00
quelle

9 Antworten

15

Verwenden Sie bitweises UND ( & ), um die alten Bits zu löschen, verschieben Sie die neuen Bits an die richtige Position und bitweise OR ( | ) zusammen:

%Vor%

Folgendes geschieht:

%Vor%     
hammar 16.07.2011, 19:09
quelle
12

Wenn ich so etwas basteln muss, mache ich eine readonly Struktur, um es für mich zu tun. Eine Vier-Bit-Ganzzahl heißt natürlich nybble:

%Vor%

Fügen Sie dann implizite Konvertierungen zwischen TwoNybbles und Byte hinzu. Jetzt können Sie jedes Byte so behandeln, dass es ein High- und ein Low-Byte hat, ohne all dieses hässliche Bit in Ihren Hauptleitungscode zu stecken.

    
Eric Lippert 16.07.2011 19:33
quelle
2

Sie maskieren zuerst die hohen vier Bytes mit value & 0xF aus. Dann verschiebst du die neuen Bits mit newFirstFour << 4 auf die hohen vier Bits und kombinierst sie schließlich mit binary oder.

%Vor%     
CodesInChaos 16.07.2011 19:09
quelle
1

Ich bin mir nicht sicher, was Ihre Methode dort machen soll, aber hier sind einige Methoden für Sie:

%Vor%

Sollte selbsterklärend sein.

    
Ry︁ 16.07.2011 19:11
quelle
1
%Vor%

Beispiel:

  • Reg = 135
  • Val = 9 (ValLen = 4, weil 9 = 1001)
  • Pos = 2

  • 135 = 10000111

  • 9 = 1001
  • 9 & lt; & lt; Pos = 100100
  • Ergebnis = 10100111
Marcello 15.06.2015 08:43
quelle
0

Ein kurzer Blick würde anzeigen, dass ein bitweises und kann erreicht werden, die & amp; Operator. Um also die ersten vier Bytes zu entfernen, sollten Sie folgendes tun können:

%Vor%     
Schroedingers Cat 16.07.2011 19:10
quelle
0

Angenommen, newVal enthält den Wert, den Sie in origVal speichern möchten. Tun Sie dies für die 4 niedrigstwertigen Bits:

%Vor%

und dies für die 4 höchstwertigen Bits:

%Vor%     
Petar Ivanov 16.07.2011 19:11
quelle
0

Ich weiß, dass Sie speziell nach dem Löschen der ersten vier Bits gefragt haben, was mehrmals beantwortet wurde, aber ich möchte darauf hinweisen, dass Sie, wenn Sie zwei Werte & lt; = Dezimal 15 haben, diese einfach mit 8 Bits kombinieren können das:

%Vor%

Das Ergebnis ist xxxxyyyy wo

%Vor%

Und das scheint es zu versuchen.

    
Igby Largeman 16.07.2011 19:28
quelle
0

Hier ist ein Code, aber ich denke, die früheren Antworten werden es für Sie tun. Dies ist nur, um eine Art von Testcode zu zeigen, der kopiert und in ein einfaches Konsolenprojekt (die WriteBits-Methode, um Hilfe):

%Vor%     
Jason Haley 16.07.2011 20:40
quelle

Tags und Links