2012-08-05 15 views
8

Tengo el siguiente:Convertir un byte o int a BitSet

int num=Integer.parseInt(lineArray[0]); 
byte numBit= num & 0xFF; 

¿Hay alguna forma muy simple para convertir numBit a una matriz de bits? O mejor aún, ¿hay alguna manera de eludir la conversión de byte de la recta int y ir desde num a una matriz de bits?

Gracias

+2

supongo que esto voluntad en su caso también ... [Stackoverflow - Bitset hacia y desde Entero largo] [1] [1]: http://stackoverflow.com/questions/2473597/bitset-to-and-from-integer-long – Pr0gr4mm3r

+1

¿Quiere decir 'boolean []' o 'BitSet'? – dacwe

Respuesta

8

Si quieres un BitSet, intente:

final byte b = ...; 
final BitSet set = BitSet.valueOf(new byte[] { b }); 

Si quieres un boolean[],

static boolean[] bits(byte b) { 
    int n = 8; 
    final boolean[] set = new boolean[n]; 
    while (--n >= 0) { 
    set[n] = (b & 0x80) != 0; 
    b <<= 1; 
    } 
    return set; 
} 

o, equivalentemente,

static boolean[] bits(final byte b) { 
    return new boolean[] { 
    (b & 1) != 0, 
    (b & 2) != 0, 
    (b & 4) != 0, 
    (b & 8) != 0, 
    (b & 0x10) != 0, 
    (b & 0x20) != 0, 
    (b & 0x40) != 0, 
    (b & 0x80) != 0 
    }; 
} 
+0

Me encontré con esta respuesta y quería señalar que los métodos 'BitSet.valueOf()' están solo en Java 7 y posterior. La pregunta no especificaba una versión de Java, pero si está en Java 6, debería poder tomar uno de los enfoques para crear un booleano [] para completar un objeto BitSet. –

+1

¿No debería ser 'set [n] = (b & 0x80)! = 0;' en su segundo fragmento? Y necesita realizar un incremento posterior en su ciclo while: 'while (n--> 0)'.De lo contrario, se está saltando el bit 0. – Jaykob

+0

@Jaykob gracias, corregido por – oldrinb

1

Se podría hacer:

char[] bits = Integer.toBinaryString(num).toCharArray(); para obtener la cadena de bits subyacente como char[]

P. ej

public BitSet getBitSet(int num){ 
    char[] bits = Integer.toBinaryString(num).toCharArray(); 
    BitSet bitSet = new BitSet(bits.length); 
    for(int i = 0; i < bits.length; i++){ 
     if(bits[i] == '1'){ 
      bitSet.set(i, true); 
     } 
     else{ 
      bitSet.set(i, false); 
     }     
    } 
    return bitSet; 
} 

Puede crear boolean [] array también de esta manera.

+0

Aquí hace doble trabajo: 'toBinaryString()' también itera sobre los bits. Sería mejor con bucle mientras 'i charlie

2

Java 7 ha BitSet.valueOf (long []) y BitSet.toLongArray()

int n = 12345; 
BitSet bs = BitSet.valueOf(new long[]{n}); 
0

vine sobre este tema, porque Android añadió el BitSet.valueOf() tan tarde como en la API 19. utilicé de oldrinb segundo fragmento de la respuesta aceptada, pero tuvo que modificarlo porque tenía algunos errores. Además lo modifiqué para devolver un BitSet, pero no debería ser un problema cambiarlo a boolean []. Ver mi comentario a su respuesta.

Esta es la modificación que ahora se ejecuta correctamente:

public static BitSet toBitSet(byte b) { 
    int n = 8; 
    final BitSet set = new BitSet(n); 
    while (n-- > 0) { 
     boolean isSet = (b & 0x80) != 0; 
     set.set(n, isSet); 
     b <<= 1; 
    } 
    return set; 
} 
0

Sólo un ejercicio en el uso de arroyos (J8 +):

// J7+ 
BitSet bitSet(final long... nums) { 
    return BitSet.valueOf(nums); 
} 

// J8+ 
final IntStream bitsSet = bitSet(num).stream(); 

// vice-versa 
BitSet bitSet(final IntStream bitsSet) { 
    return bitsSet.collect(BitSet::new, BitSet::set, BitSet::or); 
} 

// without BitSet 
IntStream bitsSet(final long... nums) { 
    return IntStream.range(0, nums.length) 
      .flatMap(n -> IntStream.range(0, Long.SIZE - 1) 
        .filter(i -> 0 != (nums[n] & 1L << i)) 
        .map(i -> i + n * Long.SIZE)); 
}