[英]BitSet toString() and valueOf() are difficult to understand
我只想使用BitSet將整數轉換為二進制字符串。
我的代碼如下。
public class BitSetTest {
public static void main(String[] args) {
//Method_1
int value = 10; //0b1010
String bits = Integer.toBinaryString(value);
BitSet bs = new BitSet(bits.length());
for (int i = 0; i < bits.length(); i++) {
if (bits.charAt(i) == '1') {
bs.set(i);
} else {
bs.clear(i);
}
}
System.out.println(bs); //{0, 2} so 0th index and 2nd index are set.
System.out.println(Arrays.toString(bs.toLongArray())); //prints [5]
System.out.println(Arrays.toString(bs.toByteArray()));
//Method_2
value = 42;
System.out.println(Integer.toBinaryString(value)); //101010
BitSet bitSet = BitSet.valueOf(new long[] { value });
System.out.println(bitSet);
System.out.println(Arrays.toString(bitSet.toLongArray())); // prints [42]
System.out.println(Arrays.toString(bitSet.toByteArray()));
}
}
Q1)我不了解的內容; 這是正確的方法(方法_1或方法_2)。 Method_1似乎是正確的,但是bs.toLongArray()
給出了不同的結果。
Q2)您能否解釋一下此api public static BitSet valueOf(long[] longs)
接受long值數組而不是單個long ..? 而這個數組到底在做什么呢。
Java doc如下: 但是我真的沒有意思。
更確切地說,BitSet.valueOf(longs).get(n)==((longs [n / 64]&(1L <<(n%64))!= 0)
對於所有n <64 * longs.length。
請幫忙。
位從右開始編號。
42 = 0b101010
543210 <-- bit numbers
因此輸出{1, 3, 5}
。
您的方法#1從左邊開始對數字進行編號。
您也不需要調用bs.clear(i)
,因為新的BitSet
沒有設置任何位。
所有位最初都是
false
。
至於BitSet.valueOf()
工作方式,這非常簡單。
byte
數據有兩個版本( byte[]
, ByteBuffer
), long
數據有兩個版本( long[]
, LongBuffer
)。
一個byte
由8位組成,而long
由64位組成。 然后,將使用第一個值的前N個(8或64)位,第二個值的后N個位來構建BitSet
,依此類推。
例如,如果您調用BitSet.valueOf(new long[] { 1, 2, 3 })
,則位0-63來自第一個數字,位64-127來自第二個數字,位128-191來自第三個數字,結果在{0, 65, 128, 129}
。
如果調用BitSet.valueOf(new byte[] { 1, 2, 3 })
,則位0-7來自第一個數字,位8-15來自第二個數字,位16-23來自第三個數字,結果{0, 9, 16, 17}
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.