我正在寻找一个好的 Java
BitSet
示例来处理 0 和 1。我尝试查看 Javadocs,但仅仅阅读它并不能理解该类的用法。例如,and
、or
和xor
方法如何在两个不同的BitSet
对象上工作?
例如:
BitSet bits1 = new BitSet();
BitSet bits2 = new BitSet();
bits2.set(1000001);
bits1.set(1111111);
bits2.and(bits1);
System.out.println(bits2);
如果我这样做,它会返回
bits2
为空,这是为什么?
对于您提到的具体问题:当您调用
bits2.set(1000001)
时,您将百万分之一和第一位设置为true。然后,当您与 bits1
相交时,其中设置了 100 万、111,000 和第 111 位,它们没有任何共同点。
我认为你想要做的是
bits2.set(0); // set the 0th bit
bits2.set(6); // set the 6th bit
这有助于澄清事情吗?
如果您想使用位,您可以使用 Java 7 中的
int
值。
int bits2 = 0b1000001;
int bits1 = 0b1111111;
bits2 &= bits1;
System.out.println(Integer.toBinaryString(bits2));
打印
1000001
BitSet 没有方便的方法来接受这样的位字符串。我在下面提供了一些内容,现在该示例可以按您的预期运行。请注意,这使用了 Java 7 中的新功能;如果您想使用 Java 6,很容易在线找到这些方法的实现。
import java.util.BitSet;
class Scratch {
public static void main(String[] args) {
BitSet bits1 = fromString("1000001");
BitSet bits2 = fromString("1111111");
System.out.println(toString(bits1)); // prints 1000001
System.out.println(toString(bits2)); // prints 1111111
bits2.and(bits1);
System.out.println(toString(bits2)); // prints 1000001
}
private static BitSet fromString(final String s) {
return BitSet.valueOf(new long[] { Long.parseLong(s, 2) });
}
private static String toString(BitSet bs) {
return Long.toString(bs.toLongArray()[0], 2);
}
}
以下是一些关于 bitSet 的链接,可以帮助您:
更新:
在文档中说:
公共无效集(int bitIndex)
Sets the bit at the specified index to true.
所以当你调用
bits2.set(10);
时,它被认为是10十进制而不是1 0所以你得到的是以下数字1000000000
。
为了正确设置它,在本例中,我想将第 2 位设置为 1,因此我调用
bits2.set(1);
,因为索引从 0 开始。
结论,对于每个设置为1的位,您需要调用bitSet.Set并为其提供该位的索引。
我正在分享使用位字符串作为输入创建 BitSet 对象的实现。
private static BitSet createFromString(String s) {
BitSet t = new BitSet(s.length());
int lastBitIndex = s.length() - 1;
for (int i = lastBitIndex; i >= 0; i--) {
if ( s.charAt(i) == '1'){
t.set(lastBitIndex - i);
}
}
return t;
}
对于字符串输入“1001”
BitSet s1 = createFromString("1001");
System.out.println(s1);
输出:
{0, 3}
试试这个:
import java.util.BitSet;
public class BitSetExample {
public static void main(String args[]){
BitSet bits1 = new BitSet(7);
BitSet bits2 = new BitSet(7);
// set some bits
for(int i = 0; i < 7; i++) {
if((i % 2) == 0) bits1.set(i);
if((i % 3) != 0) bits2.set(i);
}
System.out.println("BitSet1: ");
for(int i = 0; i < 7; i++) {
System.out.print(bits1.get(i)? "1 ": "0 ");
}
System.out.println("\nBitSet2: ");
for(int i = 0; i < 7; i++) {
System.out.print(bits2.get(i)? "1 ": "0 ");
}
System.out.println();
//And
bits1.and(bits2);
System.out.println("b1 = b1 AND b2\nBitSet1: ");
for(int i = 0; i < 7; i++) {
System.out.print(bits1.get(i)? "1 ": "0 ");
}
System.out.println();
System.out.println("BitSet2: ");
for(int i = 0; i < 7; i++) {
System.out.print(bits2.get(i)? "1 ": "0 ");
}
System.out.println();
//Or
bits1.or(bits2);
System.out.println("b1 = b1 OR b2\nBitSet1: ");
for(int i = 0; i < 7; i++) {
System.out.print(bits1.get(i)? "1 ": "0 ");
}
System.out.println();
System.out.println("BitSet2: ");
for(int i = 0; i < 7; i++) {
System.out.print(bits2.get(i)? "1 ": "0 ");
}
System.out.println();
//Xor
bits1.xor(bits2);
System.out.println("b1 = b1 XOR b2\nBitSet1: ");
for(int i = 0; i < 7; i++) {
System.out.print(bits1.get(i)? "1 ": "0 ");
}
System.out.println();
System.out.println("BitSet2: ");
for(int i = 0; i < 7; i++) {
System.out.print(bits2.get(i)? "1 ": "0 ");
}
System.out.println();
//Setting bits to zero and one
bits1.set(1);
bits2.set(1,false);
System.out.println("set bit 1 of BitSet1 to one and set bit 1 of BitSet2 to zero\nBitSet1: ");
for(int i = 0; i < 7; i++) {
System.out.print(bits1.get(i)? "1 ": "0 ");
}
System.out.println();
System.out.println("BitSet2: ");
for(int i = 0; i < 7; i++) {
System.out.print(bits2.get(i)? "1 ": "0 ");
}
System.out.println();
}
}
我希望这有用。欲了解更多信息,请访问:https://github.com/m-vahidalizadeh/foundations/blob/master/src/data_structs/BitSetExample.java.
如果您还需要使用比
Integer.MAX_VALUE
长的位地址,我修改了java.util.BitSet
(此处:LongBitSet)以接受 get 和 set 方法中的长输入。我这样做是为了充分利用内存进行 prime sieve 实验。