簡體   English   中英

BitSet toString()和valueOf()很難理解

[英]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.

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