Java BitSet

所用jdk版本为1.6.

BitSet是一个按需增长的位向量,位向量指有大小端的由0,1组成的串。此类是线程不安全的。

索引从0开始,负数索引会异常,位向量的每个位都有一个boolean值,默认情况下,初始值都是false。

BitSet 表示位值时实际使用空间的位数由size()方法返回,返回值是64的倍数,最小是64。length()方法返回的是实际使用的位大小,结果是最高设置位的索引加1。

BitSet还可以进行逻辑运算,比如与、或、异或。

BitSet的toString方法返回的是设置了true值的所有索引。

BitSet有两个构造方法:一个默认构造,一个可以传初始大小的构造。它的大小是按需增长的,如果考虑到性能,最好选择一个初始大小。

import java.util.BitSet;

public class Demo {

	public static void main(String args[]) {
		BitSet bs1 = new BitSet(16);
		BitSet bs2 = new BitSet(16);
		BitSet bs3 = new BitSet();
		BitSet bs4 = new BitSet();

		// intersects,如果两个BitSet中至少有一位双方都设置为true,则返回true
		bs3.set(1);
		bs3.set(2);
		bs4.set(1);
		System.out.println(bs3.intersects(bs4));// 输出true

		// length/size
		bs3.set(100);// 设置索引为100的位为true
		System.out.println(bs3.size());// 输出128,因为我们在索引100设置了值,因此64容纳不下,只能选择64*2=128才能够容纳。
		System.out.println(bs3.length());// 输出101,表示使用了101位二进制。

		// toString,输出值为true的索引,set方法用于设置索引的值,有几个重载,具体看文档
		for (int i = 0; i < 16; i++) {
			if ((i % 2) == 0)
				bs1.set(i);
			if ((i % 3) == 0)
				bs2.set(i);
		}
		System.out.println(bs1);// 输出{0, 2, 4, 6, 8, 10, 12, 14}
		System.out.println(bs2);// 输出{0, 3, 6, 9, 12, 15}

		// flip,即某位的值如果是true则设为false,false则设为true,第一个参数表示从哪个索引开始,第二个表示到哪个索引的前一个索引结束
		bs1.flip(0, bs1.length());
		bs2.flip(0, bs2.length());
		System.out.println(bs1);// 输出{1, 3, 5, 7, 9, 11, 13}
		System.out.println(bs2);// 输出{1, 2, 4, 5, 7, 8, 10, 11, 13, 14}

		// clear,所有位设为false
		bs1.clear();
		bs2.clear();
		System.out.println(bs1);// 输出{}
		System.out.println(bs2);// 输出{}

		// and/or/xor 这些方法改变的是当前BitSet而不是目标BitSet(即方法参数BitSet)
		// 重置bs1和bs2
		for (int i = 0; i < 16; i++) {
			if ((i % 2) == 0)
				bs1.set(i);
			if ((i % 3) == 0)
				bs2.set(i);
		}
		bs2.and(bs1);
		System.out.println(bs2);// 输出{0, 6, 12}

		// 重置bs1和bs2
		for (int i = 0; i < 16; i++) {
			if ((i % 2) == 0)
				bs1.set(i);
			if ((i % 3) == 0)
				bs2.set(i);
		}
		bs2.or(bs1);
		System.out.println(bs2);// 输出{0, 2, 3, 4, 6, 8, 9, 10, 12, 14, 15}

		// 重置bs1和bs2
		for (int i = 0; i < 16; i++) {
			if ((i % 2) == 0)
				bs1.set(i);
			if ((i % 3) == 0)
				bs2.set(i);
		}
		bs2.xor(bs1);
		System.out.println(bs2);// 输出{3, 9, 15}

		// get,获取指定索引的值
		System.out.println(bs2.get(3));// 输出true

		// cardinality,返回值为true的位数
		System.out.println(bs2.cardinality());// 输出3

		// 其他方法看文档
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值