2012-08-05 10 views
8

Ho il seguente:Convertire un byte o int a BitSet

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

Esiste un modo molto semplice per convertire numBit ad una matrice di bit? O ancora meglio, c'è un modo per aggirare la conversione dei byte di int e andare direttamente da num a un array di bit?

Grazie

+2

Credo che questo sarà per nel tuo caso anche ... [Stackoverflow - Bitset da e verso l'intero lungo] [1] [1]: http://stackoverflow.com/questions/2473597/bitset-to-and-from-integer-long – Pr0gr4mm3r

+1

Intendi 'booleano []' o 'BitSet'? – dacwe

risposta

8

Se si desidera un BitSet, provare:

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

Se si desidera 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

Ho trovato questa risposta e volevo notare che i metodi 'BitSet.valueOf()' sono solo in Java 7 e successivi. La domanda non specificava una versione Java, ma se sei in Java 6, dovresti essere in grado di adottare uno degli approcci per creare un valore booleano [] per popolare un oggetto BitSet. –

+1

Non dovrebbe essere 'set [n] = (b & 0x80)! = 0;' nel tuo secondo snippet? E hai bisogno di post-incrementare nel tuo ciclo while: 'while (n--> 0)'.Altrimenti si salta il bit 0. – Jaykob

+0

@Jaykob grazie, corretto per – oldrinb

1

Si potrebbe fare:

char[] bits = Integer.toBinaryString(num).toCharArray(); per ottenere la stringa di bit come sottostante char[]

Ad es

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

È possibile creare anche l'array boolean [] in questo modo.

+0

Qui stai facendo il doppio lavoro - 'toBinaryString()' scorre anche i bit. Saresti migliore con il ciclo while 'i charlie

2

Java 7 è BitSet.valueOf (long []) e BitSet.toLongArray()

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

Sono venuto su questa discussione perché Android ha aggiunto il BitSet.valueOf() il più tardi in API 19. ho usato di oldrinb secondo frammento di risposta accettato, ma ha dovuto modificarlo perché aveva alcuni errori. Inoltre l'ho modificato per restituire un BitSet, ma non dovrebbe essere un problema cambiarlo in booleano []. Vedi il mio commento alla sua risposta.

Questa è la modifica che ora gira con successo:

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

Solo un esercitazione nell'utilizzo torrenti (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)); 
}