当前位置: 首页 > news >正文

Java 中 BitSet 类的用法

Java 中 BitSet 类的用法

  • API
    • 构造
    • 置位为 true
    • 清除为 false
    • 查找
    • 位反转
    • 长度
    • 运算
    • 其他
  • 原理
    • 底层数据结构
    • 如何工作

API

构造

  1. 无参构造 :默认为 64 个 bit 的容量
	BitSet bitset = new BitSet();
  1. 有参构造 :设置为 n 个 bit 的容量
	BitSet bitset = new BitSet(1024);
  1. 静态工厂的 valueOf 构造 :支持从 byte[], long[], ByteBuffer, LongBuffer 四种类型构造 Bitset
   BitSet.valueOf(bytes);BitSet.valueOf(longs);BitSet.valueOf(byteBuffer);BitSet.valueOf(longBuffer);

置位为 true

  1. 单独置位
	bitset.set(4);//索引为4的位置的比特被置为1,返回void
  1. 批量置位
	bitset.set(4,6);//索引在[4,6)范围内的位置的比特被置为1,返回void

清除为 false

  1. 单独清除
	bitset.clear(4);//索引为4的位置的比特被置为0,返回void
  1. 批量清除
	bitset.clear(4,6);//索引在[4,6)范围内的位置的比特被置为0,返回void
  1. 全部清除
	bitset.clear();//所有位置都被清空为0,返回void

查找

  1. 查询某一位是否已被置位
	bitset.get(4);//返回boolean,为true表示该位被置位
  1. 获取某区间的 BitSet
	bitset.get(4,6);//返回另一个 BitSet,内容取 bitset的[4,6)之间的元素

注:获取的区间后,索引的编号会改变,比如这里新的 BitSet 的 0 号索引对应的是原来 BitSet 的 4 号索引

位反转

	bitset.flip(4);bitset.flip(4,6);

长度

有三个和长度相关的 API,分别是 size、cardinal、length

  1. size:返回该 BitSet 的最大容量
  2. cardinal:返回该 BitSet 中 1 的个数
  3. length:返回最后一个1之前的所有元素的个数,如果一个1也没有就返回0

运算

  1. 判断是否有交集
	first.intersects(second);//返回boolean,如果有交集元素则为true
  1. 求交集
	first.and(second);//返回一个 BitSet
  1. 求并集
	first.or(second);//返回一个 BitSet
  1. 求异或集
	first.xor(second);//返回一个 BitSet

	bitSet.stream();//返回一个 Stream 流

其他

下面四个方法顾名思义:

	 int idx = bitset.nextSetBit(fromIndex);int idx = bitset.previousSetBit(fromIndex); int idx = bitset.nextClearBit(fromIndex);int idx = bitset.previousClearBit(fromIndex); 

原理

底层数据结构

BitSet 的底层数据结构是 long[] 数组

如何工作

置位时,把1左移对应的位数,再与 long[] 中特定的 long 元素做或运算
查询时,把1左移对应的位数,再与 long[] 中特定的 long 元素做与运算,运算结果大于0说明该位为true

http://www.lryc.cn/news/322500.html

相关文章:

  • Jenkins-pipeline流水线构建完钉钉通知
  • 汽车制造业供应商管理会面临哪些问题?要如何解决?
  • day28|93. 复原 IP 地址|Leetcode 78. 子集|90.子集II
  • 怎样提升小程序日活?签到抽奖可行吗?
  • hive语法树分析,判断 sql语句中有没有select *
  • 【论文阅读】MSGNet:学习多变量时间序列预测中的多尺度间序列相关性
  • 智慧城市与数字孪生:共创未来城市的智慧生活
  • 【Ubuntu】FTP站点搭建
  • RK3228H is the same SoC as rk3328.
  • Golang 开发实战day04 - Standard Library
  • 程序员排查BUG指南
  • 【Vue】elementUI-MessageBox组件相关
  • 数据库运行状况和性能监控工具
  • CTF-辨别细菌
  • RuoYi-Vue开源项目2-前端登录验证码生成过程分析
  • error: C preprocessor fails sanity check
  • Kubernetes实战(三十一)-安装containerd
  • 使用docker搭建faiss向量数据库
  • 安卓面试题多线程 121-125
  • 什么是 HTTPS?它是如何解决安全性问题的?
  • C++入门(下)
  • 2024-03-20 作业
  • 【机器学习】深入解析线性回归模型
  • 新一代云原生数据库OLAP
  • JavaEE--小Demo
  • 一代大神跌落神坛——Java炸了!
  • 面试算法-64-零钱兑换
  • Java复习06 Spring 代码概念
  • 【研究僧总结】回顾第1095个创作日
  • QT(6.5) cmake构建C++编程,调用python