您的位置:首页 > 编程语言 > Java开发

Java中的Bitset类

2015-08-10 14:26 585 查看
位集合类实现了一组可以单独设置和清除的位或标志。
该类在处理一组布尔值的时候非常有用,是一组大小可动态改变, 取值为true或false的位集合,用于表示一组布尔标志,你只需要给每个值赋值一"位"。然后对位进行适当的设置或清除,就可以对布尔值进行操作了。

此类实现了一个按需增长的位向量。位 set 的每个组件都有一个 boolean 值。用非负的整数将 BitSet 的位编入索引。可以对每个编入索引的位进行测试、设置或者清除。通过逻辑与、逻辑或和逻辑异或操作,可以使用一个 BitSet 修改另一个 BitSet 的内容。

默认情况下,set 中所有位的初始值都是 false。

每个位 set 都有一个当前大小,也就是该位 set 当前所用空间的位数。注意,这个大小与位 set 的实现有关,所以它可能随实现的不同而更改。位 set 的长度与位 set 的逻辑长度有关,并且是与实现无关而定义的。

除非另行说明,否则将 null 参数传递给 BitSet 中的任何方法都将导致 NullPointerException。

没有外部同步的情况下,多个线程操作一个 BitSet
是不安全的。

下面是该类的详细使用信息:
构造方法一:

创建一个默认的对象:Bitset()

构造方法二:

创建一个指定初始大小的对象,所有位初始化为0,0代表:false,1代表:true=>Bitset(int size)

所有方法:

请自己参看API

实例1:Bitset里面一些方法的简单使用

import java.util.BitSet;

public class BitSetDemo {

public static void main(String args[]) {

BitSet bits1 = new BitSet(16);

BitSet bits2 = new BitSet(16);

// set some bits

for(int i=0; i<16; i++) {

if((i%2) == 0) bits1.set(i);

if((i%5) != 0) bits2.set(i);

}

System.out.println("Initial pattern in bits1: ");

System.out.println(bits1);

System.out.println("\nInitial pattern in bits2: ");

System.out.println(bits2);

// AND bits

bits2.and(bits1);

System.out.println("\nbits2 AND bits1: ");

System.out.println(bits2);

// OR bits

bits2.or(bits1);

System.out.println("\nbits2 OR bits1: ");

System.out.println(bits2);

// XOR bits

bits2.xor(bits1);

System.out.println("\nbits2 XOR bits1: ");

System.out.println(bits2);

System.out.println("\nbits1的总长度: " + bits1.size());

for (int i = 0;i<bits1.size();i++) {

System.out.println(bits1.get(i));

}

System.out.println("\nbits2的总长度: " + bits2.size());

bits2.set('a');

bits2.set('b');

for (int i = 0;i<bits2.size();i++) {

System.out.println(bits2.get(i));

}

System.out.println(bits2);

}

}

输出结果:

Initial pattern in bits1:

{0, 2, 4, 6, 8, 10, 12, 14}

Initial pattern in bits2:

{1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14}

bits2 AND bits1:

{2, 4, 6, 8, 12, 14}

bits2 OR bits1:

{0, 2, 4, 6, 8, 10, 12, 14}

bits2 XOR bits1:

{}

bits1的总长度: 64-------------------------为什么长度是64?=》说明默认的构造函数声明一个64位的BitSet,值都是false。如果你要用的位超过了默认size,它会再申请64位,而不是报错。

true

false

true

false

true

false

true

false

true

false

true

false

true

false

true

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

bits2的总长度: 64

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

true

true

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

false

{97, 98}

实例2:标明一个字符串中用了哪些字符

import java.util.BitSet;
public class WhichChars{
private BitSet used = new BitSet();
public WhichChars(String str){
for(int i=0;i< str.length();i++)
used.set(str.charAt(i));  // set bit for char
}
public String toString(){
String desc="[";
int size=used.size();
for(int i=0;i< size;i++){
if(used.get(i))
desc+=(char)i;
}
return desc+"]";
}
public static void main(String args[]){
WhichChars w=new WhichChars("How do you do");
System.out.println(w);
}
}

运行:

C:\work>java WhichChars

[ Hdouwy]

实例3:在BitSet中存值~取值:

import java.util.BitSet;
public class MainTestFive {

//找出数据集合最大值

public static int getMaxValue(int[] zu){

int temp=0;

temp=zu[0];

for(int i=0;i<zu.length;i++){

if(temp<zu[i]){

temp=zu[i];

}

}

System.out.println("maxvalue:"+temp);

return temp;

}

//放值

public static void putValueIntoBitSet(int[] shu,BitSet bs){

for(int i=0;i<shu.length;i++){

bs.set(shu[i], true);

}

}

/**

* @param args

*/

public static void main(String[] args) {

int[] shu={2,42,5,6,6,18,33,15,25,31,28,37};

BitSet bm1=new BitSet(MainTestFive.getMaxValue(shu));

System.out.println("bm1.size()--"+bm1.size());

MainTestFive.putValueIntoBitSet(shu, bm1);

printBitSet(bm1);

}

//初始全部为false,这个你可以不用,因为默认都是false

public static void initBitSet(BitSet bs){

for(int i=0;i<bs.size();i++){

bs.set(i, false);

}

}

//打印

public static void printBitSet(BitSet bs){

StringBuffer buf=new StringBuffer();

buf.append("[\n");

for(int i=0;i<bs.size();i++){

if(i<bs.size()-1){

buf.append(MainTestFive.getBitTo10(bs.get(i))+",");

}else{

buf.append(MainTestFive.getBitTo10(bs.get(i)));

}

if((i+1)%8==0&&i!=0){

buf.append("\n");

}

}

buf.append("]");

System.out.println(buf.toString());

}

//true,false换成1,0为了好看

public static String getBitTo10(boolean flag){

String a="";

if(flag==true){

return "1";

}else{

return "0";

}

}

}

注意:对重复的数字过滤,就是说,一个数字出现过超过2次的它都记成1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: