我只想使用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。
请帮忙。
答案 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}
。