Java BitSet 示例

问题描述 投票:0回答:7

我正在寻找一个好的 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
为空,这是为什么?

java bitset
7个回答
113
投票

对于您提到的具体问题:当您调用

bits2.set(1000001)
时,您将百万分之一和第一位设置为true。然后,当您与
bits1
相交时,其中设置了 100 万、111,000 和第 111 位,它们没有任何共同点。

我认为你想要做的是

 bits2.set(0); // set the 0th bit
 bits2.set(6); // set the 6th bit

这有助于澄清事情吗?


60
投票

如果您想使用位,您可以使用 Java 7 中的

int
值。

int bits2 = 0b1000001;
int bits1 = 0b1111111;
bits2 &= bits1;
System.out.println(Integer.toBinaryString(bits2));

打印

1000001

48
投票

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);
    }
}

8
投票

以下是一些关于 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并为其提供该位的索引。


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;
}

对于字符串输入“1001”

BitSet s1 = createFromString("1001");
    System.out.println(s1);

输出:

{0, 3}

0
投票

试试这个:

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.


0
投票

如果您还需要使用比

Integer.MAX_VALUE
长的位地址,我修改了
java.util.BitSet
此处:LongBitSet)以接受 get 和 set 方法中的长输入。我这样做是为了充分利用内存进行 prime sieve 实验。

© www.soinside.com 2019 - 2024. All rights reserved.