Java位集初始化
我正在为我的程序使用BitSet类。 我需要一个内联声明,如:Java位集初始化,java,initialization,bitset,Java,Initialization,Bitset,我正在为我的程序使用BitSet类。 我需要一个内联声明,如: BitSet bits1 = new BitSet(); //standard declaration bits1.set(0,2); bits1.set(4,6); System.out.println(bits1); //110011 BitSet bits2 = BitSet.valueOf(new long[] {1,1,0,0,1,1}); //inline System.out.println(bits2); 通过这
BitSet bits1 = new BitSet(); //standard declaration
bits1.set(0,2);
bits1.set(4,6);
System.out.println(bits1); //110011
BitSet bits2 = BitSet.valueOf(new long[] {1,1,0,0,1,1}); //inline
System.out.println(bits2);
通过这段代码,我试图复制位s1、位s2中的相同位集。
问题如下:打印和值不同。
我设置的位集是110011。第一个打印出{0,1,4,5},这是正确的,因为这是使用索引打印位集的“好”方法,第二个打印出{0,64,256,320}。
正如你所看到的,第二个是错误的。我很确定内联初始化是错误的,但我不知道如何解决这个问题。数组中的每一个长度代表64位。您只需要一个设置了4位的长字符:
BitSet bits2 = BitSet.valueOf(new long[] {0b110011});
System.out.println(bits2);
// {0, 1, 4, 5}
数组中的每个long表示64位。您只需要一个设置了4位的长字符:
BitSet bits2 = BitSet.valueOf(new long[] {0b110011});
System.out.println(bits2);
// {0, 1, 4, 5}
long
有64位。如果要使用long[]
构造函数,需要将位打包在一起。long
有64位。如果你想使用long[]
构造函数,你需要将这些位打包在一起。这对我很有用!还有一个问题:110011之前的0b是什么意思?它是一种常量吗?@user840718它告诉编译器将数字读取为。是否还有一个内置方法可以以二进制文字打印出位集?@user840718问得好。我不知道有什么内置方法,但这里有一个有点黑的解决方案:Arrays.stream(bits2.toLongArray()).mapToObj(l->String.format(“%64s”,Long.tobinarysting(l)).replace(“,”0')).collector(Collectors.joining())
@shmosel你不应该在它的末尾添加一个.replaceFirst(“^0+,”,“$1”)
?()
和$1
用于在全零的情况下保留至少一个数字。这对我来说很有用!还有一个问题:110011之前的0b是什么意思?它是一种常量吗?@user840718它告诉编译器将数字读取为。是否还有一个内置方法可以以二进制文字打印出位集?@user840718问得好。我不知道有什么内置方法,但这里有一个有点黑的解决方案:Arrays.stream(bits2.toLongArray()).mapToObj(l->String.format(“%64s”,Long.tobinarysting(l)).replace(“,”0')).collector(Collectors.joining())
@shmosel你不应该在它的末尾添加一个.replaceFirst(“^0+,”,“$1”)
?()
和$1
用于在全零的情况下至少保留一位数字。