2012-02-17 46 views
47

我正在寻找一个好的Java BitSet示例以使用0和1s。我试着看着Javadocs,但是我不明白这个类的用法。例如,and,orxor方法如何在两个不同的BitSet对象上工作?Java BitSet示例

例如:

BitSet bits1 = new BitSet(); 
    BitSet bits2 = new BitSet(); 

    bits2.set(1000001); 
    bits1.set(1111111); 

    bits2.and(bits1); 

    System.out.println(bits2); 

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

+2

http://en.wikipedia.org/wiki/Bitwise_operation - 他们的工作方式与他们在使用'&|时相同。 ^'等与原始数字类型。 – 2012-02-17 18:49:04

+0

什么,具体来说,你不明白?你创建一个BitSet,然后调用它的函数,比如'.and','.or'和'.xor'。每个函数都将另一个BitSet对象作为参数。 – Tony 2012-02-17 18:51:49

+0

嗯,我试着对上面的例子做一个'和',并且bitset变空了。 – 2012-02-17 18:58:40

回答

94

对于您提到的具体问题:当您拨打bits2.set(1000001)时,将第一百万位和第一位设置为true。然后,当你与bits1相交时,其中有一百一十一万一千一百一十一位被设置,它们没有共同的位。

我想你意思做的是

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

这是否帮助清楚的事情了?

8

以下是有关的BitSet一些链接,这将有助于您:

UPDATE:

在文档,它是说:

公共无效集(INT bitIndex处)

Sets the bit at the specified index to true. 

所以,当你调用bits2.set(10);,它被认为是10进制没有所以你得到的是以下数量1000000000

为了正确设置,在本例中,我想将第二位设置为1,所以我拨打bits2.set(1);,因为索引从开始。

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

39

BitSet没有方便的方法来接受像这样的位串。我在下面提供了一些,现在这个例子按照你的预期工作。请注意,这使用Java 7中的新功能;它很容易在网上找到这些方法的实现,如果你想如果你想与位工作,你可以在Java 7中使用int值使用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); 
    } 
} 
+1

完美!我喜欢你的'toString(BitSet bs)'方法。很有用!您可以反转这些位以将bit_0放在右侧。 – 2015-02-11 12:23:19

52

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

打印

1000001 
+0

当你把它们保存为'ints'时,他们是在'4字节还是'7位'? – daydreamer 2015-10-20 21:39:39

+1

@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位。即使是参数化的构造函数也会这样说:“创建一个初始大小足够大的位集合**以明确地表示索引在该范围内的位...” – mbomb007 2016-06-16 14:05:06

4

我分享我的执行创建使用位作为输入的字符串位集合对象。

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} 
+1

为什么使用while循环? for循环可以做得更好,因为在每次迭代中你都会减少1。 – 2014-09-19 14:34:00

+0

编辑:使用For循环的代码的更好的版本,感谢@Clément的建议:) – 2014-11-16 18:05:05

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_structures/BitSetExample.java