2010-11-04 32 views
7

Tengo una matriz de bytes. Quiero acceder a cada uno de los bytes y quiero su valor binario equivalente (de 8 bits) para realizar las siguientes operaciones en él. He oído hablar de BitSet, pero ¿hay alguna otra forma de lidiar con esto?¿Cómo convertir un byte en bits?

Gracias.

+0

Gracias a todos ustedes! :) He intentado todas las cosas que se dan a continuación, pero lo que he hecho es que he tomado individual de bytes de la matriz y luego he usado el (valor de byte) Método Integer.toBinaryString. Me dio el resultado deseado. – Supereme

Respuesta

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

Si sólo necesita la representación de cadena en binario puede simplemente usar Integer.toString() con el segundo parámetro opcional se establece en 2 para binario.

Para realizar movimientos de bits generales en cualquier tipo integral, debe utilizar operadores lógicos y de desplazamiento de bits.

// 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 tiene bitwise operators. Ver a tutorial example.

El lenguaje de programación Java también proporciona operadores que realizan operaciones de cambio de bit y bits en tipos integrales. Los operadores discutidos en esta sección son menos utilizados. Por lo tanto, su cobertura es breve; la intención es simplemente informarle que estos operadores existen.

El operador unario complementario en modo bit "~" invierte un patrón de bits; se puede aplicar a cualquiera de los tipos integrales, haciendo que cada "0" sea "1" y cada "1" sea "0". Por ejemplo, un byte contiene 8 bits; aplicar este operador a un valor cuyo patrón de bits es "00000000" cambiaría su patrón a "11111111".

A byte valor IS integral, puede verificar el estado de los bits mediante operaciones de enmascaramiento. El bit menos significativo corresponde a la máscara o 10x1, el siguiente bit corresponden a 0x2, etc.

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

'if (b & 0x1)' no compila. Debe usar 'if (b & 0x1 == 0x1)' –

+0

Gracias.Java no es C ;-) – gimel

4

Usted puede encontrar algo en la línea de lo que estás buscando en el paquete Guava Primitives.

Alternativamente, es posible que desee escribir algo como

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; 
} 

eso no es probado, pero la idea está ahí. También hay modificaciones fáciles en los bucles/asignación para devolver una matriz de otra cosa (por ejemplo, int o long).

+2

Le hubiera dado a esto un +1, excepto que usaste la palabra "elsewise". –

0

Bueno, yo creo que consiga lo que quiere decir. Ahora, un error bastante importante con esto es que no funciona en números negativos. Sin embargo, suponiendo que no lo esté utilizando para leer las entradas de archivos, es posible que aún pueda usarlo.

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; 
}