2012-08-05 25 views
8

我有以下幾點:轉換一個字節或int位集合

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

是否有numBit轉換爲位陣列的任何非常簡單的方法?或者甚至更好,有沒有辦法繞過int和直接從num直接轉換爲位數組?

感謝

+2

... [Stackoverflow - 從整數長度的位集] [1] [1]:http://stackoverflow.com/questions/2473597/bitset-to-and-from-integer-long – Pr0gr4mm3r 2012-08-05 22:05:01

+1

你是指'boolean []'或'BitSet'? – dacwe 2012-08-05 22:06:01

回答

8

如果你想有一個BitSet,嘗試:

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

如果你想有一個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; 
} 

,或者等價地,

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

我遇到了這個答案,並希望指出'BitSet.valueOf()'方法只在Java 7及更高版本中。這個問題沒有指定Java版本,但如果你在Java 6中,你應該能夠採取其中一種方法來創建一個布爾[]來填充一個BitSet對象。 – 2015-01-23 16:06:58

+1

不應該是'set [n] =(b&0x80)!= 0;'在你的第二個片段中嗎? 而你需要在你的while循環中進行後期增量:'while(n--> 0)'。否則,你跳過位0. – Jaykob 2015-11-03 13:05:14

+0

@Jaykob謝謝,更正爲 – oldrinb 2015-11-04 14:24:46

1

你可以這樣做:

char[] bits = Integer.toBinaryString(num).toCharArray();得到底層位字符串作爲char[]

例如

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

你也可以這樣創建boolean []數組。

+0

你在這裏做了雙重工作 - 'toBinaryString()'也遍歷這些位。當'i charlie 2016-07-04 10:28:41

2

Java 7中已經BitSet.valueOf( long [])和BitSet.toLongArray()

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

我來到這個線程,因爲Android的加入BitSet.valueOf()遲在API 19 我用oldrinb的接受答案的第二個片段,但不得不修改它,因爲它有一些錯誤。此外,我修改它返回一個BitSet,但它不應該是一個問題,將其更改爲布爾[]。看到我對他的回覆的評論。

這是現在成功運行的修改:使用只是一個鍛鍊; Tibial流(J8 +)

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

:我在你的情況猜測這會爲太

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