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

时间:2016-05-11 18:11:34

标签: java

我只想使用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)我不理解的东西;这是正确的方法(Method_1或Method_2)。 Method_1似乎是正确的,但bs.toLongArray()给出了不同的结果。

Q2)你能否解释一下这个api public static BitSet valueOf(long[] longs)接受长值数组而不是单个长...?这个阵列到底做了什么。

Java doc在下面说;但我真的没有意义。

  

更准确地说,BitSet.valueOf(longs).get(n)==((longs [n / 64]&amp;   (1L <&lt;(n%64)))!= 0)
  对于所有n&lt; 64 * longs.length。

请帮忙。

1 个答案:

答案 0 :(得分:6)

比特从右边开始编号。

42 = 0b101010
       543210 <-- bit numbers

因此输出{1, 3, 5}

你的方法#1从左边开始编号。

您也无需致电bs.clear(i),因为新的BitSet没有设置任何位。

  

所有位最初都是false

关于BitSet.valueOf()如何运作,这很简单。

byte数据有两个版本(byte[]ByteBuffer),long数据有两个版本(long[]LongBuffer )。

A byte由8位组成,long由64位组成。然后,BitSet将使用第一个值中的前N(8或64)位,第二个值中的后N位,依此类推。

E.g。如果你拨打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}