2013-07-08 1 views
5

Ho un singolo byte che contiene due valori. Ecco la documentazione:Come lavorare con i bit in un byte

Il byte di autorizzazione è diviso in due campi. I tre bit meno significativi portano il livello di autorità dell'utente (0-5). I cinque bit più significativi di hanno una soglia di rifiuto prioritaria. Se questi bit sono impostati su zero, la soglia di rifiuto del sistema viene utilizzata per determinare se un punteggio per questo utente è considerato un accettare o rifiutare. Se sono non zero, il valore di questi bit moltiplicato per dieci sarà il punteggio di soglia per questo utente.

Autorità Byte:

7 6 5 4 3 ......... 2 1 0 
Reject Threshold .. Authority 

Non ho alcuna esperienza di lavoro con i bit in C#.

Qualcuno può aiutarmi a convertire un byte e ottenere i valori come indicato sopra?

ho provato il seguente codice:

BitArray BA = new BitArray(mybyte); 

Ma la lunghezza ritorna come 29 e mi sarei aspettato 8, essendo ogni bit nel byte.

- Grazie per l'aiuto rapido di tutti. Ho funzionato ora! Internet fantastico

+0

È possibile trovare [questo post] (http://stackoverflow.com/questions/93744/most-common-c-sharp-bitwise-operations-on-enums) di interesse anche. –

risposta

7

Invece di BitArray, è più facile utilizzare il built-in bitwise AND e right-shift operatore come segue:

byte authorityByte = ... 

int authorityLevel = authorityByte & 7; 
int rejectThreshold = authorityByte >> 3; 

Per ottenere il singolo byte di nuovo, è possibile utilizzare il bitwise OR e left-shift operatore:

int authorityLevel = ... 
int rejectThreshold = ... 

Debug.Assert(authorityLevel >= 0 && authorityLevel <= 7); 
Debug.Assert(rejectThreshold >= 0 && rejectThreshold <= 31); 

byte authorityByte = (byte)((rejectThreshold << 3) | authorityLevel); 
+0

Puoi dirmi come convertire questi due valori in un singolo byte? – Anonymous

3

Si sta utilizzando il costruttore errato (probabilmente).

Quella che si sta utilizzando è probabilmente this one, mentre è necessario this one:

var bitArray = new BitArray(new [] { myByte }); 
5

L'utilizzo del BitArray non è corretto. Questo:

BitArray BA = new BitArray(mybyte); 

..will essere implicitamente convertito in un int. Quando ciò accade, si sta innescando questo costruttore:

BitArray(int length); 

..therefore, la sua creazione con una lunghezza specifica.

Guardando MSDN (http://msdn.microsoft.com/en-us/library/x1xda43a.aspx) si desidera che questo:

BitArray BA = new BitArray(new byte[] { myByte }); 

Lunghezza sarà quindi 8 (come previsto).

3

per ottenere un valore di cinque bit più significativi in ​​un byte come un numero intero, spostare l'byte a destra da 3 (cioè per 8-5), e impostare i tre bit superiori a zero usando bit per bit AND funzionamento, come questo :

byte orig = ... 
int rejThreshold = (orig >> 3) & 0x1F; 
  • >> è l'operatore di "spostamento a destra". Sposta i bit 7..3 nelle posizioni 4..0, lasciando cadere i tre bit inferiori.
  • 0x1F è il numero binario 00011111, che ha i tre bit superiori impostati su zero e i cinque bit inferiori impostati su uno. AND -ing con questo numero azzera i tre bit superiori.

Questa tecnica può essere generalizzata per ottenere altri tipi di bit e altri tipi di dati integrali. Spostare i bit che si desidera nella posizione meno significativa e applicare una maschera che "ritaglia" il numero di bit desiderati. In alcuni casi, lo spostamento non sarebbe necessario (ad esempio quando si ottiene il gruppo di bit meno significativo). In altri casi, come sopra, il mascheramento non sarebbe necessario, perché si ottiene il gruppo più significativo di bit in un tipo senza segno (se il tipo è firmato, sarebbe richiesto AND ing).