2010-11-04 17 views
7

Ho una matrice di byte. Voglio accedere a ciascuno dei byte e voglio il suo equivalente valore binario (di 8 bit) in modo da eseguire le successive operazioni su di esso. Ho sentito parlare di BitSet ma c'è un altro modo di affrontare questo?Come convertire un byte in bit?

Grazie.

+0

Grazie a tutti voi! :) Ho provato tutte le cose date di seguito, ma quello che ho fatto è che ho preso individuale dei byte dalla matrice e poi ho usato il (valore di byte) Metodo Integer.toBinaryString. Mi ha dato l'output desiderato. – Supereme

risposta

3
byte ar[] ; 
byte b = ar[0];//you have 8 bits value here,if I understood your Question correctly :) 
8

Se avete solo bisogno la rappresentazione String di esso in binario si può semplicemente utilizzare Integer.toString() con il secondo parametro opzionale impostato a 2 per binario.

Per eseguire il bit in generale su un qualsiasi tipo di integrale, è necessario utilizzare operatori logici e bithift.

// tests if bit is set in value 
boolean isSet(byte value, int bit){ 
    return (value&(1<<bit))!=0; 
} 

// returns a byte with the required bit set 
byte set(byte value, int bit){ 
    return value|(1<<bit); 
} 
2

Java ha bitwise operators. Vedi a tutorial example.

Il linguaggio di programmazione Java fornisce anche operatori che eseguono operazioni di bit e bit shift su tipi interi. Gli operatori discussi in questa sezione sono meno comunemente utilizzati. Pertanto, la loro copertura è breve; l'intento è semplicemente farti capire che questi operatori esistono.

L'operatore di complemento bit per bit unario "~" inverte un pattern di bit; può essere applicato a qualsiasi tipo di integrale, rendendo ogni "0" a "1" e ogni "1" a "0". Ad esempio, un byte contiene 8 bit; applicando questo operatore ad un valore il cui schema di bit è "00000000" cambierebbe il suo modello in "11111111".

A byte valore IS integrale, è possibile verificare lo stato dei bit utilizzando le operazioni di mascheramento. Il bit meno significativo corrisponde alla maschera 1 o 0x1, il bit successivo corrispondono a 0x2, ecc

byte b = 3; 
if((b & 0x1) == 0x1) { 
    // LSB is on 
} else { 
    // LSB is off 
} 
+0

'if (b & 0x1)' non viene compilato. È necessario utilizzare 'if (b & 0x1 == 0x1)' –

+0

Grazie.Java non è C ;-) – gimel

4

potreste trovare qualcosa sulla falsariga di quello che stai cercando nel pacchetto Guava Primitives.

In alternativa, si potrebbe desiderare di scrivere qualcosa di simile

public boolean[] convert(byte...bs) { 
boolean[] result = new boolean[Byte.SIZE*bs.length]; 
int offset = 0; 
for (byte b : bs) { 
    for (int i=0; i<Byte.SIZE; i++) result[i+offset] = (b >> i & 0x1) != 0x0; 
    offset+=Byte.SIZE; 
} 
return result; 
} 

che non è testato, ma l'idea c'è. Ci sono anche semplici modifiche ai loop/assegnazioni per restituire un array di qualcos'altro (ad esempio, int o long).

+2

Avrei dato un +1, tranne che hai usato la parola "elsewise". –

0

Beh penso che ottengo quello che vuoi dire. Ora un errore piuttosto consistente con questo è che non funziona su numeri negativi. Tuttavia, supponendo che tu non lo stia utilizzando per leggere gli input dei file, potresti comunque essere in grado di usarli.

public static ArrayList<Boolean> toBitArr(byte[] bytearr){ 
    ArrayList<Boolean> bitarr = new ArrayList<Boolean>(); 
    ArrayList<Boolean> temp = new ArrayList<Boolean>(); 
    int i = 0; 
    for(byte b: bytearr){ 
     while(Math.abs(b) > 0){ 
      temp.add((b % 2) == 1); 
      b = (byte) (b >> 1); 
     } 
     Collections.reverse(temp); 
     bitarr.addAll(temp); 
     temp.clear(); 
    } 
    return bitarr; 
}