`

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`是一个功能强大的工具,能够帮助我们有效地处理二进制...

    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)...

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

    由于long的基本操作(如按位或、按位与、按位异或)在Java中是原子的,因此在单线程环境下,我们可以直接对BitSet进行位操作而不用担心数据不一致的问题。但是,当多个线程同时修改BitSet时,由于这些操作不是原子的...

    大数据杀手锏:揭秘 C++ 中 BitSet 与 BloomFilter 的神奇性能!

    《 C++ 修炼全景指南:十四 》大数据杀手锏:揭秘 C++ 中 BitSet 与 BloomFilter 的神奇性能! https://lenyiin.blog.csdn.net/article/details/142710211 这篇博客所涉及的所有完整代码 。本篇博客深入探讨了 C++ ...

    Go-bitset-Go包实现bitsets

    1. **bitset的基本概念** - 位集是用二进制位来表示数据,每一位对应一个布尔值,0表示假,1表示真。 - 由于位运算的高效性,位集在处理大量布尔值时比使用普通数组或列表更高效。 - 在Go的`bitset`包中,位集...

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

    C++标准库bitset类型的简单使用方法介绍 C++标准库bitset类型是一个非常有用的工具,旨在帮助开发者高效地处理二进制数据。Std::bitset是一个模板类,其模板参数是一个整数值,表示位数的大小。通过使用bitset,...

    c++ bitset实现

    6. **迭代器支持**:为了方便遍历位,可能会实现迭代器,使`bitset`可以与标准算法一起使用。 7. **静态和动态大小**:标准库的`std::bitset`有固定的大小,但在自定义实现中,可以设计为支持动态调整大小。 8. **...

    java 原生包 BitSet 源码

    - 稀疏数据集:当数据集中只有少量数据被标记为true时,使用BitSet比使用布尔数组更高效。 - 计算位图:在某些计算密集型任务中,比如图形处理、数据压缩等,BitSet可以用来存储和操作位图。 在学习BitSet源码时,...

    可以动态扩展的bitset

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

    C++下bitset简介

    此外,`bitset`支持算术和逻辑运算,如`&`(与)、`|`(或)、`^`(异或)和`~`(非)。 在处理大量位标志时,`bitset`的优势在于其简洁的语法和高效的内存管理。由于位运算直接在硬件级别进行,因此速度极快。对于需要跟踪...

    C++ bitset的简单使用示例

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

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

    通过逻辑与、逻辑或和逻辑异或操作,可以使用一个 BitSet 修改另一个 BitSet 的内容。 什么是 BitSet? BitSet 类实现了一个按需增长的位向量。位 Set 的每一个组件都有一个 boolean 值,用非负的整数将 BitSet 的...

    BitSet 源码分析.txt

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

    dm-bitset.rar_thin

    This bitset type is a thin wrapper round a dm_array of 64bit words.This bitset type is a thin wrapper round a dm_array of 64bit words.

    使用bitset实现毫秒级查询(实例讲解)

    使用bitset实现毫秒级查询实例讲解 bitset是Java中的一种数据结构,通过使用bitset可以实现毫秒级查询。下面我们将详细讲解如何使用bitset实现毫秒级查询。 bitset的内部实现是long数组,每一个位的默认值为false...

    Java编程中的HashSet和BitSet详解

    他们使用BitSet来存储要删除的索引,然后使用BitSet来快速地删除数组中的元素。这样做的原因是BitSet可以高效地存储和操作大量的布尔值数据,从而提高程序的性能。 在实际应用中,我们可以根据具体情况选择使用...

    详解C++ bitset用法

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

Global site tag (gtag.js) - Google Analytics