簡體   English   中英

將byte或int轉換為bitset

[英]Convert a byte or int to bitset

我有以下內容:

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

有沒有非常簡單的方法將numBit轉換為位數組? 或者更好的是,有沒有辦法繞過int的字節轉換並從num直到數組?

謝謝

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

Java 7有BitSet.valueOf(long [])和BitSet.toLongArray()

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

你可以這樣做:

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 []數組。

我來到這個線程是因為Android在API 19中添加了BitSet.valueOf() 。我使用了oldrinb的第二段接受的答案,但由於它有一些錯誤而不得不修改它。 另外我修改它以返回一個BitSet,但將它更改為boolean []應該不是問題。 請參閱我對他的回復的評論。

這是現在成功運行的修改:

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

只是一個使用的練習(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));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM