2012-10-02 9 views
12

Ich lese einige Werte von einem einzelnen Byte. Mir wird im Benutzerhandbuch gesagt, dass dieses eine Byte 3 verschiedene Werte enthält. Es gibt eine Tabelle, die wie folgt aussieht:C#, Bits & Bytes - Wie kann ich Bitwerte von einem Byte abrufen?

bit table

ich interpretieren, dass Sinn Präzision 3 Bits nimmt hat, Maßstab nimmt 2 und Größe nimmt 3 für insgesamt 8 (1 Byte).

Was ich bin nicht klar ist:

1 - Warum es 7 bis 0 markiert ist anstelle von 0 bis 7 (etwas mit Bedeutung zu tun, vielleicht?)

2 - Wie kann ich extrahieren die einzelnen Werte aus diesem einen Byte?

Antwort

17

Es ist üblich, um Bits in einem Byte entsprechend ihrer Bedeutung zu nummerieren: Bit x repräsentiert 2^x. Gemäß diesem Nummerierungsschema erhält das niedrigstwertige Bit die Nummer Null, das nächste Bit ist die Nummer Eins und so weiter.

einzelne Bits Erste erfordert eine Verschiebung und eine Maskierungsoperation:

var size = (v >> 0) & 7; 
var scale = (v >> 3) & 3; 
var precision = (v >> 5) & 7; 

Verschiebung durch die Anzahl der Bits rechts von dem äußersten rechten Teil, die Sie erhalten müssen (Verschiebung von Null ignoriert wird, ich hinzugefügt zu Illustrationszwecken).

Maske mit der höchsten Nummer, die in die Anzahl der Bits passt, die Sie erhalten möchten: 1 für ein Bit, 3 für zwei Bits, 7 für drei Bits, 2^x-1 für x Bits.

+0

Danke für die Erklärung, wie die Maskennummer auch funktioniert. – bugfixr

+0

Probieren Sie die Operatoren andersherum aus: var size = ((v & 7) >> 0); var Maßstab = ((v & 28) >> 3); var Präzision = ((v & 224) >> 5); – Robetto

3

1. Ja, das höchstwertige Bit wird normalerweise zuerst geschrieben. Das am weitesten links liegende Bit ist mit 7 gekennzeichnet, da das Bit, wenn es als Ganzzahl interpretiert wird, den Wert 2 (= 128) hat, wenn es gesetzt ist.

Dies ist völlig natürlich und ist in der Tat genau das gleiche wie Sie Dezimalzahlen schreiben (höchstwertige Stelle zuerst). Zum Beispiel ist die Zahl 356 (3 x 10 ) + (5 x 10 ) + (6 x 10 ).

2. Zur Vervollständigung, wie in anderen Antworten erwähnt können Sie die einzelnen Werte extrahieren Sie die Bit-Verschiebung und bitweise und mit Hilfe von Operatoren wie folgt:

int size = x & 7; 
int scale = (x >> 3) & 3; 
int precision = (x >> 5) & 7; 

Wichtiger Hinweis: Dies setzt voraus, dass die einzelnen Werte sind interpretiert werden als positive ganze Zahlen. Wenn die Werte negativ sein könnten, wird dies nicht korrekt funktionieren. Angesichts der Namen Ihrer Variablen ist dies hier wahrscheinlich kein Problem.

+0

Wir jeweils unterschiedliche beantwortet Hälften der Frage. Teilen wir eine Aufzählung oder etwas? : D – Wug

4
  1. Potayto, potahto.

  2. Sie Schichten und Masken verwenden würde, um die unerwünschten Bits abzuflachen, wie solche:

    byte b = something; // b is our byte 
    
    int size = b & 0x7; 
    int scale = (b >> 3) & 0x3; 
    int position = (b >> 5) & 0x7; 
    
1

du über bitweise Arithmetik tun können:

uint precision = (thatByte & 0xe0) >> 5, 
    scale = (thatByte & 0x18) >> 3, 
    size = thatByte & 7; 
6

Sie können Verschiebungen und Masken tun, oder können Sie die BitArray Klasse verwenden: http://msdn.microsoft.com/en-us/library/system.collections.bitarray.aspx

Beispiel mit BitVector32:

BitVector32 bv = new BitVector32(0); 

var size = BitVector32.CreateSection(7); 
var scale = BitVector32.CreateSection(3, size); 
var precision = BitVector32.CreateSection(7, scale); 

bv[size] = 5; 
bv[scale] = 2; 
bv[precision] = 4; 

LINQPad Ausgang:

LINQPad output

+0

+1 für den Hinweis auf eine Alternative, die nicht auf die Tage von C: P [BitVector32] (http://msdn.microsoft.com/en-us/library/system.collections.specialized.bitvector32.aspx) zurückgreift) ist eine weitere Option, mit der Sie auch Ihr Bitfeld in Abschnitte unterteilen können (entsprechend der Größe, Skalierung und Genauigkeit des OPs) und diese direkt mithilfe der Indexierungssyntax zuweisen oder lesen können. – shambulator

+0

Dies ist eine Linkantwort. – Wug

Verwandte Themen