`

BitSet与EnumSet的基本使用

阅读更多
   如果要高效率的存贮大量开关信息,BitSet是很好的选择,不过它的效率是针对空间而言的;如果需要高效的访问时间,BitSet比本地数组稍慢一些。BitSet的最小容量是64位,如果存储的内容比较小,如8位。那么BitSet就浪费了一些空间。BitSet会随着元素的加入而扩充其容量。
   以下示范BitSet是如何工作的。
package containers;
//: containers/Bits.java
// Demonstration of BitSet.
import java.util.*;
import static net.mindview.util.Print.*;

public class Bits {
	public static void printBitSet(BitSet b) {
		print("bits: " + b);
		StringBuilder bbits = new StringBuilder();
		for (int j = 0; j < b.size(); j++)
			bbits.append(b.get(j) ? "1" : "0");
		print("bit pattern: " + bbits);
	}

	public static void main(String[] args) {
		Random rand = new Random(47);
		// Take the LSB of nextInt():
		byte bt = (byte) rand.nextInt();
		BitSet bb = new BitSet();
		for (int i = 7; i >= 0; i--)
			if (((1 << i) & bt) != 0)
				bb.set(i);
			else
				bb.clear(i);
		print("byte value: " + bt);
		printBitSet(bb);

		short st = (short) rand.nextInt();
		BitSet bs = new BitSet();
		for (int i = 15; i >= 0; i--)
			if (((1 << i) & st) != 0)
				bs.set(i);
			else
				bs.clear(i);
		print("short value: " + st);
		printBitSet(bs);

		int it = rand.nextInt();
		BitSet bi = new BitSet();
		for (int i = 31; i >= 0; i--)
			if (((1 << i) & it) != 0)
				bi.set(i);
			else
				bi.clear(i);
		print("int value: " + it);
		printBitSet(bi);

		// Test bitsets >= 64 bits:
		BitSet b127 = new BitSet();
		b127.set(127);
		print("set bit 127: " + b127);
		BitSet b255 = new BitSet(65);
		b255.set(255);
		print("set bit 255: " + b255);
		BitSet b1023 = new BitSet(512);
		b1023.set(1023);
		b1023.set(1024);
		print("set bit 1023: " + b1023);
	}
} 

输出结果如下:
byte value: -107
bits: {0, 2, 4, 7}
bit pattern: 1010100100000000000000000000000000000000000000000000000000000000
short value: 1302
bits: {1, 2, 4, 8, 10}
bit pattern: 0110100010100000000000000000000000000000000000000000000000000000
int value: -2014573909
bits: {0, 1, 3, 5, 7, 9, 11, 18, 19, 21, 22, 23, 24, 25, 26, 31}
bit pattern: 1101010101010000001101111110000100000000000000000000000000000000
set bit 127: {127}
set bit 255: {255}
set bit 1023: {1023, 1024}

   随机生成byte,short,int类型数值,每一个都被转换为BitSet中相应的位模式。因为BitSet初始为64位的,所以生成的随机数都不会导致其扩容。随后创建了一个更大的BitSet,可以看到Bit在必要时进行了扩。
   如果你拥有一个可以命名的固定的标志集合,那么EnumSet与BitSet相比,更具有优势。因为EnumSet允许你按照名字而不是数字位置啦进行操作,可以减少错误。而且,EnumSet还可以防止你因不注意而添加新的位置标志。你应该使用BitSet的理由包括:只有在运行时才知道需要多少个标志位;对标志命名不合理;需要BitSet提供的特殊操作。
  下面演示使用EnumSet替代传统的基于int的“位标志”。它是与枚举类型一起使用的专用 Set 实现。枚举 set 中所有键都必须来自单个枚举类型,该枚举类型在创建 set 时显式或隐式地指定。枚举 set 在内部表示为位向量。
//: enumerated/AlarmPoints.java
package enumerated;

public enum AlarmPoints {
	STAIR1, STAIR2, LOBBY, OFFICE1, OFFICE2, OFFICE3, OFFICE4, BATHROOM, UTILITY, KITCHEN
} // /:~

//: enumerated/EnumSets.java
// Operations on EnumSets
package enumerated;

import java.util.*;
import static enumerated.AlarmPoints.*;
import static net.mindview.util.Print.*;

public class EnumSets {
	public static void main(String[] args) {
		EnumSet<AlarmPoints> points = EnumSet.noneOf(AlarmPoints.class); // Empty
																			// set
		points.add(BATHROOM);
		print(points);
		points.addAll(EnumSet.of(STAIR1, STAIR2, KITCHEN));
		print(points);
		points = EnumSet.allOf(AlarmPoints.class);
		points.removeAll(EnumSet.of(STAIR1, STAIR2, KITCHEN));
		print(points);
		points.removeAll(EnumSet.range(OFFICE1, OFFICE4));
		print(points);
		points = EnumSet.complementOf(points);
		print(points);
	}
} 


输出结果:
[BATHROOM]
[STAIR1, STAIR2, BATHROOM, KITCHEN]
[LOBBY, OFFICE1, OFFICE2, OFFICE3, OFFICE4, BATHROOM, UTILITY]
[LOBBY, BATHROOM, UTILITY]
[STAIR1, STAIR2, OFFICE1, OFFICE2, OFFICE3, OFFICE4, KITCHEN]
分享到:
评论

相关推荐

    bitset用法 bitset用法

    bitset用法bitset用法bitset用法bitset用法bitset用法bitset用法

    C语言头文件 BITSET

    C语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC...

    动态Bitset源代码

    //将高位与低位互相,如数组存放的是1011,则本函数执行后为1101 Bitset& reverse(); //返回左边n位,构成新的Bitset Bitset left(size_t n) const; //返回右边n位,构成新的Bitset Bitset right(size_t n)...

    可以动态扩展的bitset

    文档模仿STL库的BITSET写的一个bitset,但是和STL不同的是这个类是一个可以动态扩展的,使用方法和STL的类似,可以参考STL使用

    acm相关资料vector、bitset

    acm相关资料vector、bitset、大数乘法等等

    C++标准库bitset类型的简单使用方法介绍

    主要介绍了C++标准库bitset类型的简单使用方法,需要的朋友可以参考下

    C++ bitset的简单使用示例

    bitset 一般代替 bool 数组使用,常用于优化空间,因为 bitset 中一个元素只占 1 bit。 bitset 的大小在定义使就需要确定。如果想要不定长的 bitset,就需要使用 vector。 bitset 的定义: bitset&lt;16&gt; bt; // 定义...

    BitSet 源码分析.txt

    基于JDK1.8的BitSet 源码分析, 描述了实现的原理 个方法的含义 虽然没有写出实际的测试代码 但是只要是细度了我的这个分析 在使用的时候就不是问题了

    Go-bitset-Go包实现bitsets

    bitset - Go包实现 bitsets

    c++ bitset实现

    自己实现的bitset数据结构,在vs2005下编译通过。有测试成素。

    详解C++ bitset用法

    C++的 bitset 在 bitset 头文件中,它是一种类似数组的结构,它的每一个元素只能是0或1,每个元素仅用1bit空间。 下面是具体用法 构造函数 bitset常用构造函数有四种,如下 bitset&lt;4&gt; bitset1; //无参构造,...

    C++下bitset简介

    C++下的bitset,强大而简单的位运算功能,象使用数组一样对位进行操作

    c++遗传算法,用bitset实现

    使用C++编写的遗传算法,代码量200行左右,供大家学习研究,互相交流。

    浅谈Java BitSet使用场景和代码示例

    主要介绍了浅谈Java BitSet使用场景和代码示例,具有一定借鉴价值,需要的朋友可以参考下。

    认识C++中的bitset类型

     我们要使用bitset,首先需要包含头文件bitset。和vector对象不一样的是bitset类型对象的区别仅在其长度而不在其类型。在定义bitset的时候,要明确bitset包含了多少位,须在尖括号内给出它的长度值。长度值必须...

    RoaringBitmap, 在Java中,一个更好的压缩 bitset.zip

    RoaringBitmap, 在Java中,一个更好的压缩 bitset RoaringBitmap Bitsets,也称为位图,通常用作快速数据结构。 不幸的是,他们可以使用太多的内存。 为了补偿,我们经常使用压缩位图。咆哮位图是压缩位图,它比传统...

    基于C++ bitset常用函数及运算符(详解)

    C++ bitset——高端压位卡常题必备STL ———————————————————— 以下内容翻译自cplusplus.com,极大地锻炼了我的英语能力。 bitset存储二进制数位。 bitset就像一个bool类型的数组一样,但是有空间...

    对java的BitSet的多线程并发的探索

    NULL 博文链接:https://huangyunbin.iteye.com/blog/2194731

    javabitset源码-javaewah:JavaBitSet类的压缩替代品

    java bitset源码Java 这是 Java Bitset 类的字对齐压缩变体。...与 JavaEWAH 中的其他位图类一样,这个未压缩的 BitSet 类支持内存映射文件以及许多其他便利。 为了获得更好的性能,在使用 64 位方案 (javaewa

Global site tag (gtag.js) - Google Analytics