Java BitSet示例

Ste*_*ris 57 java bitset

我正在寻找一个好的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);
Run Code Online (Sandbox Code Playgroud)

如果我这样做,它返回bits2为空为什么是这样?

Lou*_*man 105

对于您提到的具体问题:当您调用时bits2.set(1000001),将百万分之一和第一位设置为true.然后,当你与bits1一百万,一亿一千一百一十一和第一百一十二位设置相交时,它们没有共同点.

我想你的意思

 bits2.set(0); // set the 0th bit
 bits2.set(6); // set the 6th bit
Run Code Online (Sandbox Code Playgroud)

这有助于澄清问题吗?

  • @JAVA我不知道该如何解释得更清楚,bits1仅将一位设置为true,即索引为一百万和一位(数字1,000,001),bits2仅将一位设置为true,指数为10011.111万的比特(1,111,111)。 (2认同)

Pet*_*rey 57

如果要使用位,可以使用intJava 7中的值.

int bits2 = 0b1000001;
int bits1 = 0b1111111;
bits2 &= bits1;
System.out.println(Integer.toBinaryString(bits2));
Run Code Online (Sandbox Code Playgroud)

版画

1000001
Run Code Online (Sandbox Code Playgroud)

  • @daydreamer查看[源代码](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/BitSet.java)显示, BitSet在幕后以long []的形式实现。“第i位存储在i%64位的i [64]位中(其中,位0表示最低有效位,63表示最高有效位)。” 因此,至少任何BitSet都将使用64位。甚至参数化的构造函数都说“创建一个位集,其初始大小**足够大**以显式表示具有索引范围内的位...” (2认同)

Fau*_*aux 45

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);
    }
}
Run Code Online (Sandbox Code Playgroud)


Ade*_*ros 8

这里有一些关于bitSet的链接可以帮助你:

更新:

在文档中,有人说:

public void set(int bitIndex)

Sets the bit at the specified index to true.
Run Code Online (Sandbox Code Playgroud)

所以当你打电话时bits2.set(10);,它被认为是10十进制而不是1 0所以你得到的是以下数字1000000000.

要正确设置,在本例中,我想将第2位设置为1,因此我调用bits2.set(1);因为索引从0开始.

总之,对于设置为1的每个位,您需要调用bitSet.Set并为其提供位的索引.


Adi*_*kar 6

我正在分享我使用位串作为输入创建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;
}
Run Code Online (Sandbox Code Playgroud)

对于字符串输入"1001"

BitSet s1 = createFromString("1001");
    System.out.println(s1);
Run Code Online (Sandbox Code Playgroud)

输出:

{0, 3}
Run Code Online (Sandbox Code Playgroud)