BitSet 的简单介绍

BitSet,即位图,是位操作的对象,值只有 0 或 1(即 false 或 true)。

Java 的 BitSet 内部维护着一个 long 数组,默认初始化时数组的长度为 1,随着数据的增加,BitSet 会自动扩容。

public class BitSet implements Cloneable, java.io.Serializable {
private long[] words;
}

构造方法

//创建一个默认的对象(64为),所有位初始化为 false
BitSet(); //允许用户指定初始大小,所有位初始化为 false
BitSet(int nbits);

常用方法

//a = a & b
void and(BitSet set); //a = a & !b
void andNot(BitSet set); //a = a^b
void xor(BitSet set); //a = a | b
void or(BitSet set); //将指定索引处的位设置为 true
void set(int bitIndex) //将指定索引处的位设置为指定的值
void set(int bitIndex, boolean value); //将指定的 fromIndex(包括)到指定的 toIndex(不包括)范围内的位设置为 true
void set(int fromIndex, int toIndex); //将指定的 fromIndex(包括)到指定的 toIndex(不包括)范围内的位设置为指定的值
void set(int fromIndex, int toIndex, boolean value); //返回指定索引处的位值
boolean get(int bitIndex); //返回一个新的 BitSet,它由 fromIndex(包括)到 toIndex(不包括)范围内的位组成
BitSet get(int fromIndex, int toIndex); //返回此 BitSet 的“逻辑大小”,即实际使用的位数
int length(); //返回此 BitSet 表示位值时实际使用空间的位数,即 words.length * 64
int size(); //将此 BitSet 中的所有位设置为 false
void clear(); //将索引指定处的位设置为 false
void clear(int bitIndex); //将指定的 fromIndex(包括)到指定的 toIndex(不包括)范围内的位设置为 false
void clear(int fromIndex, int toIndex); //将指定索引处的值设置为其当前值的补码
void flip(int bitIndex); //将 fromIndex(包括)到指定的 toIndex(不包括)范围内的每个位设置为其当前值的补码
void flip(int fromIndex, int toIndex); //返回此 BitSet 中设置为 true 的位数
int cardinality(); //如果指定 BitSet 中设置为 true 的位,在此 BitSet 中也为 true,则返回 ture
boolean intersects(BitSet set); //如果此 BitSet 中没有包含任何设置为 true 的位,则返回 ture
boolean isEmpty(); //返回 fromIndex(包括)之后第一个设置为 false 的位的索引
int nextClearBit(int fromIndex); //返回 fromIndex(包括)之后的第一个设置为 true 的位的索引
int nextSetBit(int fromIndex); //返回该 BitSet 中为 true 的索引的字符串拼接形式
String toString(); //返回 hashcode 值
int hashcode(); //复制此 BitSet,生成一个与之相等的新 BitSet。
Object clone(); //将此对象与指定的对象进行比较。
boolean equals(Object obj);

BitSet 的简单使用

import java.util.BitSet;

public class BitSetDemo {
public static void main(String args[]) {
BitSet bits1 = new BitSet(16);
BitSet bits2 = new BitSet(16); for (int i = 0; i < 16; i++) {
if ((i % 2) == 0) {
bits1.set(i); //1010-1010-1010-1010
} if ((i % 5) != 0) { //0111-1011-1101-1110
bits2.set(i);
}
} System.out.println(bits1); //{0, 2, 4, 6, 8, 10, 12, 14}
System.out.println(bits2); //{1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14} // bits2 = bits2 & bits1
bits2.and(bits1); //0010-1010-1000-1010
System.out.println(bits2); //{2, 4, 6, 8, 12, 14} // bits2 = bits2 | bits1
bits2.or(bits1); //1010-1010-1010-1010
System.out.println(bits2); //{0, 2, 4, 6, 8, 10, 12, 14} // bits2 = bits2 ^ bits1
bits2.xor(bits1); //0000-0000-0000-0000
System.out.println(bits2); //{}
}
}
  • 有 \(1\) 千万个随机数,随机数的范围在 \(1\) 到 \(1\) 亿之间。现在要求写出一种算法,将 \(1\) 到 \(1\) 亿之间没有在随机数中出现的数求出来?
import java.util.BitSet;
import java.util.Random; public class BitSetDemo { public static void main(String args[]) {
Random random = new Random();
//索引为 0 的位置弃用
BitSet bitSet = new BitSet(100000001); for (int i = 0; i < 10000000; i++) {
//随机选取 1 到 100000000 的数,并将 BitSet 中相应的位设为 true
bitSet.set(random.nextInt(100000000) + 1);
} System.out.println("1~1 亿不在上述随机数中有:" + (100000000 - bitSet.cardinality()));
for(int i = 1; i <= 100000000; i++) {
if(!bitSet.get(i)) {
System.out.println("i");
}
}
}
}

BitSet 的使用的更多相关文章

  1. strtok源码 bitset 空间压缩

    源代码里有一段: unsigned char map[32]; /* Clear control map */ for (count = 0; count < 32; count++) map[ ...

  2. DFS序+线段树+bitset CF 620E New Year Tree(圣诞树)

    题目链接 题意: 一棵以1为根的树,树上每个节点有颜色标记(<=60),有两种操作: 1. 可以把某个节点的子树的节点(包括本身)都改成某种颜色 2. 查询某个节点的子树上(包括本身)有多少个不 ...

  3. 把《c++ primer》读薄(3-3 标准库bitset类型)

    督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. //开头 #include <bitset> using std::bitset; 问题1.标准库bitset类型( ...

  4. BitSet构造函数的两种特例

    C++11之后,bitset的构造函数新加了两种形式: bitset<bits>::bitset (const string& str, string::size_type str ...

  5. Bitset<>用于unordered container时的默认hash函数

    自从c++11起,bitset用于unordered container,将会提供默认的hash函数. 在gcc中,相关代码如下: // DR 1182. /// std::hash speciali ...

  6. hdu 4920 Matrix multiplication bitset优化常数

    Matrix multiplication Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/ ...

  7. hdu 5506 GT and set dfs+bitset优化

    GT and set Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Probl ...

  8. (DFS、bitset)AOJ-0525 Osenbei

    题目地址 简要题意: 给出n行m列的0.1矩阵,每次操作可以将任意一行或一列反转,即这一行或一列中0变为1,1变为0.问通过任意多次这样的变换,最多可以使矩阵中有多少个1. 思路分析: 行数比较小,先 ...

  9. Gym 100917J---Judgement(01背包+bitset)

    题目链接 http://codeforces.com/gym/100917/problem/J Description standard input/outputStatements The jury ...

  10. C++二进制文件中读写bitset

    这个比较简单,直接上代码: bitset< > *b = >(); bitset< > *c = >(); ofstream out("I:\\test. ...

随机推荐

  1. java List接口中常用类

    Vector:线程安全,但速度慢,已被ArrayList替代. ArrayList:线程不安全,查询速度快. LinkedList:链表结构,增删速度快.取出List集合中元素的方式: get(int ...

  2. php 变量名前加一个下划线含义

    https://segmentfault.com/q/1010000006467833 一个下划线是私有变量以及私有方法两个下划线是PHP内置变量. 以下划线开头,表示为类的私有成员. 这只是个不成文 ...

  3. SVN 树冲突解决详解

    https://blog.csdn.net/xgf415/article/details/75196714 SVN 冲突包括 内容冲突:当两名(或更多)开发人员修改了同一个文件中相邻或相同的行时就会发 ...

  4. python基础十之装饰器

    1,装饰器的形成 编程原则:开放封闭原则. 开放:对扩展是开放的 封闭:对修改是封闭的 因为修改是封闭的,所以为了对函数进行功能的扩展,就使用装饰器! 2,装饰器的定义 # wrapper就是一个装饰 ...

  5. H3C 被动方式建立连接过程

  6. linux ioctl 方法

    ioctl, 我们在第 1 章展示给你如何使用, 是一个系统调用, 作用于一个文件描述符; 它 接收一个确定要进行的命令的数字和(可选地)另一个参数, 常常是一个指针. 作为一个使 用 /proc 文 ...

  7. 2019-9-22-dotnet-core-导出-COM-组件

    title author date CreateTime categories dotnet core 导出 COM 组件 lindexi 2019-09-22 20:25:38 +0800 2019 ...

  8. 与正则有关的JS方法结合其在项目中的应用

    与正则有关的JS方法结合其在项目中的应用 前言 最近项目中用到正则匹配比较多,因此打算深入理解和总结下各个与正则有关的方法,再结合在项目中使用的情况.与正则有关的JS方法共有7个,分别是RegExp对 ...

  9. Date日期时间相关

    最近在封装一个关于时间函数的功能时,竟发现这些最基本的函数都有些生疏,于是进来来总结复习下,巩固自己记忆的同时,希望能帮助到需要的人 首先了解下日期对象相关的方法 var date = new Dat ...

  10. Kafka Eagle安装详情及问题解答

    1.概述 最近有很多同学给笔者留言,说在安装Kafka Eagle的时候,会遇到一些问题,请教如何解决?今天笔者就在这里总结一下安装步骤,和一些安装的注意事项,以及解决方式. 2.内容 在安装Kafk ...