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%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.
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.
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%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%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
Und das scheint es zu versuchen.
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%Tags und Links c# bit-manipulation