一、测试代码
public class BitSetTest { public static void main(String[] args) { BitSet bitsetOne = generateBitSet(5); // bitsetOne.set(6);//取消注释后这里不会报错,为什么?难道是因为默认的size大小是64位? printResult(bitsetOne);//打印位集内容 BitSet bitsetTwo = generateBitSet(5); printResult(bitsetTwo); //由于位集运算时会直接改变原位集内容,所以这里使用副本参与计算 BitSetAnd((BitSet)bitsetOne.clone(), (BitSet)bitsetTwo.clone()); BitSetOr((BitSet)bitsetOne.clone(), (BitSet)bitsetTwo.clone()); BitSetXor((BitSet)bitsetOne.clone(), (BitSet)bitsetTwo.clone()); } /** * 随机生成位集 * */ public static BitSet generateBitSet(int n){ System.out.println("BitSet values:"); BitSet bitSet = new BitSet(); Random r = new Random(); for(int i = 0; i < n; i++){ int rand = r.nextInt(2);//当产生的随机数为1时,把相应位设置为true,否则,保持默认值不变 System.out.print(rand + " "); if(rand == 1){ bitSet.set(i); } } System.out.println(); return bitSet; } /** * 执行位集的与操作 * */ public static void BitSetAnd(BitSet bitsetOne, BitSet bitsetTwo){ bitsetOne.and(bitsetTwo); System.out.println("BitSet And Result:"); printResult(bitsetOne); } /** * 执行位集的或操作 * */ public static void BitSetOr(BitSet bitsetOne, BitSet bitsetTwo){ bitsetOne.or(bitsetTwo); System.out.println("BitSet Or Result:"); printResult(bitsetOne); } /** * 执行位集的异或操作 * */ public static void BitSetXor(BitSet bitsetOne, BitSet bitsetTwo){ bitsetOne.xor(bitsetTwo); System.out.println("BitSet Xor Result:"); printResult(bitsetOne); } /** * 打印位集内容 * */ public static void printResult(BitSet set){ System.out.println("BitSet toString:" + set.toString()); System.out.println("BitSet length:" + set.length()); System.out.println("BitSet size:" + set.size()); for(int i = 0; i < set.length(); i++){ System.out.print(set.get(i) + " "); } System.out.println(); System.out.println(); } }
二、执行结果
BitSet values: 0 0 1 1 0 BitSet toString:{2, 3} BitSet length:4 BitSet size:64 false false true true BitSet values: 1 0 0 1 0 BitSet toString:{0, 3} //返回该BitSet所有被设置为true的位索引 BitSet length:4 //至于为什么不是5,请仔细阅读BitSet length函数返回值含义 BitSet size:64 true false false true //至于为什么最后一个bit未打印出来,请仔细阅读BitSet length函数返回值含义 BitSet And Result: BitSet toString:{3} BitSet length:4 BitSet size:64 false false false true BitSet Or Result: BitSet toString:{0, 2, 3} BitSet length:4 BitSet size:64 true false true true BitSet Xor Result: BitSet toString:{0, 2} BitSet length:3 BitSet size:64 true false true
三、关键API说明
(1)默认情况下,set 中所有位的初始值都是 false
。
(2)public intlength()
BitSet
的“逻辑大小”:BitSet
中最高设置位的索引加 1。如果 BitSet
中不包含任何设置位,则返回零。
BitSet
的逻辑大小(注:如果该BitSet创建后没有任何位被设置为true,则该BitSet的length值为0,而不是创建函数中指定的那个值)。(3)public int size()
BitSet
表示位值时实际使用空间的位数(虽然空间可能未被使用,但会分配)。set 中值最大的元素是第 size - 1 个元素。
(4)public void set(int bitIndex)
true
。
bitIndex
- 一个位索引。
(5)public String toString()
BitSet
中包含的、处于已设置状态的每个位的索引,在结果中会包含这些索引的十进制表示形式。这些索引是按从低到高的顺序列出的、之间用 "," 分隔(一个逗号加一个空格),并用括号括起来,结果形成了一组整数的常用数学符号。
重写 Object
的 toString
方法。
示例:
BitSet drPepper = new BitSet();
现在 drPepper.toString()
返回 "{}
"。
drPepper.set(2);
现在 drPepper.toString()
返回 "{2}
"。
drPepper.set(4);
drPepper.set(10);
现在 drPepper.toString()
返回 "{2, 4, 10}
"。
Object
中的 toString