一、测试代码
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 int length()
-
返回此
BitSet
的“逻辑大小”:BitSet
中最高设置位的索引加 1。如果BitSet
中不包含任何设置位,则返回零。 -
-
-
返回:
-
此
BitSet
的逻辑大小(注:如果该BitSet创建后没有任何位被设置为true,则该BitSet的length值为0,而不是创建函数中指定的那个值)。
-
此
(3)public int size()
-
返回此
BitSet
表示位值时实际使用空间的位数(虽然空间可能未被使用,但会分配)。set 中值最大的元素是第 size - 1 个元素。 -
-
-
返回:
- 此位 set 中当前的位数(创建后默认大小为64位,当空间用完后再增加64位)。
(4)public void set(int bitIndex)
-
将指定索引处的位设置为
true
。 -
-
-
参数:
-
bitIndex
- 一个位索引。
-
(5)public String toString()
-
返回此位 set 的字符串表示形式。对于此
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}
"。 -
-
返回:
- 此位 set 的字符串表示形式。