2012-08-05 13 views
8

Mam następujący:Konwersja bajt lub int do bitset

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

Czy istnieje bardzo prosty sposób konwertować numBit do tablicy bitowej? Albo jeszcze lepiej, czy istnieje sposób na ominięcie konwersji bajtów int i przejście od num do tablicy bitów?

Dzięki

+2

Chyba tę wolę w przypadku zbyt ... [Stackoverflow - Bitset do iz Integer Long] [1] [1]: http://stackoverflow.com/questions/2473597/bitset-to-and-from-integer-long – Pr0gr4mm3r

+1

Masz na myśli 'boolean []' lub 'BitSet'? – dacwe

Odpowiedz

8

Jeśli chcesz BitSet, spróbuj:

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

Jeśli chcesz 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; 
} 

lub równoważnie

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

Natknąłem się na tę odpowiedź i chciałem zauważyć, że metody 'BitSet.valueOf()' są tylko w Javie 7 i późniejszych. Pytanie nie określało wersji Java, ale jeśli znajdujesz się w Javie 6, powinieneś być w stanie przyjąć jedno z podejść, aby utworzyć boolean [] do zapełnienia obiektu BitSet. –

+1

Czy nie powinno to być "set [n] = (b & 0x80)! = 0;" w Twoim drugim fragmencie kodu? I musisz post-inkrementować w swojej pętli while: 'while (n--> 0)'.W przeciwnym razie pomijasz bit 0. – Jaykob

+0

@Jaykob dzięki, poprawione dla – oldrinb

1

Można zrobić:

char[] bits = Integer.toBinaryString(num).toCharArray(); uzyskać podstawową bitowy ciąg jako char[]

Np W takim przypadku można utworzyć tablicę boolean [].

+0

Wykonujesz tutaj podwójną pracę - 'toBinaryString()' iteruje także po bitach. Lepiej z pętlą podczas 'i charlie

2

Java 7 jest BitSet.valueOf (long []) i BitSet.toLongArray()

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

doszedłem o tym wątku ponieważ Android dodał BitSet.valueOf() dopiero w API 19. użyłem oldrinb na 2nd fragment przyjętej odpowiedź, ale musiał zmodyfikować go, ponieważ miał kilka błędów. Dodatkowo zmodyfikowałem go tak, aby zwrócił bitset, ale nie powinno być problemu z jego zamianą na boolean []. Zobacz mój komentarz do jego odpowiedzi.

Jest to modyfikacja, która teraz prowadzi z powodzeniem:

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

Po prostu ćwiczenia w użyciu strumieni (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)); 
}