Java BitSet示例
我正在寻找一个好的Java BitSet
示例来处理0和1s。 我试着看着Javadocs,但是我不明白这个类的用法。 例如,如何在两个不同的BitSet
对象上使用and
, or
和xor
方法?
例如:
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。 那么当你与位1相交时,其中有一百一十一万一千一百一十一位被设置,它们没有相同的位。
我想你的意思是
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没有像这样接受string的便利方法。 我已经在下面提供了一些,现在这个例子可以像你期望的那样工作。 请注意,这使用Java 7中的新function; 如果你想使用Java 6,很容易在网上find这些方法的实现。
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的链接可以帮助你:
- http://www.java-samples.com/showtutorial.php?tutorialid=378
- http://www.codeguru.com/java/tij/tij0090.shtml
- http://imagenious.wordpress.com/2008/02/05/java-bitset-vs-primitive/
更新:
在文档中,有人说:
public void set(int bitIndex)
Sets the bit at the specified index to true.
所以当你调用bits2.set(10);
,它被认为是十进制不是1 0,所以你得到的是下面的数字1000000000
。
为了正确设置,在这个例子中,我想将第二位设置为1,所以我调用bits2.set(1);
因为索引从0开始。
总之 ,对于设置为1的每一位,您需要调用bitSet.Set并为其提供该位的索引。
我分享我的实现创build一个BitSet对象使用位串作为input。
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; }
对于stringinput“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_structures/BitSetExample.java 。