BitSet 的使用
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 的使用的更多相关文章
- strtok源码 bitset 空间压缩
源代码里有一段: unsigned char map[32]; /* Clear control map */ for (count = 0; count < 32; count++) map[ ...
- DFS序+线段树+bitset CF 620E New Year Tree(圣诞树)
题目链接 题意: 一棵以1为根的树,树上每个节点有颜色标记(<=60),有两种操作: 1. 可以把某个节点的子树的节点(包括本身)都改成某种颜色 2. 查询某个节点的子树上(包括本身)有多少个不 ...
- 把《c++ primer》读薄(3-3 标准库bitset类型)
督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. //开头 #include <bitset> using std::bitset; 问题1.标准库bitset类型( ...
- BitSet构造函数的两种特例
C++11之后,bitset的构造函数新加了两种形式: bitset<bits>::bitset (const string& str, string::size_type str ...
- Bitset<>用于unordered container时的默认hash函数
自从c++11起,bitset用于unordered container,将会提供默认的hash函数. 在gcc中,相关代码如下: // DR 1182. /// std::hash speciali ...
- hdu 4920 Matrix multiplication bitset优化常数
Matrix multiplication Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/ ...
- 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 ...
- (DFS、bitset)AOJ-0525 Osenbei
题目地址 简要题意: 给出n行m列的0.1矩阵,每次操作可以将任意一行或一列反转,即这一行或一列中0变为1,1变为0.问通过任意多次这样的变换,最多可以使矩阵中有多少个1. 思路分析: 行数比较小,先 ...
- Gym 100917J---Judgement(01背包+bitset)
题目链接 http://codeforces.com/gym/100917/problem/J Description standard input/outputStatements The jury ...
- C++二进制文件中读写bitset
这个比较简单,直接上代码: bitset< > *b = >(); bitset< > *c = >(); ofstream out("I:\\test. ...
随机推荐
- 在做微信分享到朋友圈时,手机扫码报config:invalid signature,分享后后正常的问题,是url问题
是按照以下步骤检查的 除了ACCESS_TOKEN没有缓存其他都可以 如果是invalid signature签名错误.建议按如下顺序检查: 1.确认签名算法正确,可用 http://mp.weixi ...
- 关于DOM的一些基础问题
什么是 DOM? DOM 是一项 W3C (World Wide Web Consortium) 标准,全称是文档对象模型(Document Object Model). DOM 定义了访问文档的标准 ...
- win10 uwp 依赖属性
本文告诉大家如何使用依赖属性,包括在 UWP 和 WPF 如何使用. 本文不会告诉大家依赖属性的好处,只是简单告诉大家如何使用 在 UWP 和 wpf ,如果需要创建自己的依赖属性,可以使用代码片,在 ...
- Cookie内不能直接存入中文,cookie转码以及解码
如果在cookie中存入中文,极易出现问题. js在存入cookie时,利用escape() 函数可对字符串进行编码, 用unescape()进行解码 顺序是先把cookie用escape()函数编码 ...
- Codeforces Round #196 (Div. 1 + Div. 2)
A. Puzzles 对\(f[]\)排序,取连续的\(m\)个. B. Routine Problem 考虑\(\frac{a}{b}\)和\(\frac{c}{d}\)的大小关系,适配后就是分数的 ...
- redis cluster和hash slot
redis cluster介绍 从redis3.0.0开始,官方支持了redis cluster的集群模式,结束了redis没有集群的时代. redis cluster 支撑 N 个 redis ma ...
- PHP判断类型
is_bool();//判断是否为布尔型 is_float(); //判断是否为浮点型 is_int(); //判断是否为整型 is_numeric(); //判断是否为数值型 is_ ...
- Canvas学习实践:一款简单的动画游戏
最近学习了下Canvas绘图...突发奇想就有了下面这款简单的小游戏,纯属娱乐~ 废话不多说,直接上代码: <!DOCTYPE html> <html lang="zh&q ...
- 大数据vs计算机
大数据有两个方向,一个是偏计算机的,另一个是偏经济的.你学过Java,所以你可以偏将计算机 基础1. 读书<Introduction to Data Mining>,这本书很浅显易懂,没有 ...
- codeforces 1183H 动态规划
codeforces 1183H 动态规划 传送门:https://codeforces.com/contest/1183/problem/H 题意: 给你一串长度为n的字符串,你需要寻找出他的最长的 ...