此BitMap不是指图片存储格式里的位图。
Bit即比特,是目前计算机系统里边数据的最小单位,8个bit即为一个Byte。一个bit的值,或者是0,或者是1;也就是说一个bit能存储的最多信息是2。
BitMap可以理解为通过一个bit数组来存储特定数据的一种数据结构;由于bit是数据的最小单位,所以这种数据结构往往是非常节省存储空间。
//可用于布隆过滤器
//样本量 n 失误率p 哈希函数 k
//m = -(n * lnp) / (ln2)^2
//k = ln2 * m/n ≈ 0.7 * m/n (向上取整)
public class BitMap {
public int[] bitmap;
//[0] 31 ~ 00
//[1] 63 ~ 32
//[2] 95 ~ 64
//a % b = a & (b-1)(b=2^n)
//即:a % (2^ n) = a & (2^n-1)
public BitMap(int length) {
//int = 32
this.bitmap = new int[length];
}
@Override
public String toString() {
return "BitMap{" +
"bitmap=" + Arrays.toString(bitmap) +
'}';
}
//取得BitMap第n位
int get(int n) {
/*
int a = num / 32;//n >> 5;
int b = num % 32;//n & 31;
int c = (bitmap[a] >> b) & 1;
*/
return (bitmap[n >> 5] >> (n & 31)) & 1;
}
//将BitMap第n位设置为0
void set0(int n) {
/*
int a = n / 32;//n >> 5;
int b = n % 32;//n & 31;
bitmap[a] &= ~(1 << b);
*/
bitmap[n >> 5] &= ~(1 << (n & 31));
}
//将BitMap第n位设置为1
void set1(int n) {
/*
int a = n / 32;//n >> 5;
int b = n % 32;//n & 31;
bitmap[a] |= (1 << b);
*/
bitmap[n >> 5] |= (1 << (n & 31));
}
//将BitMap第n位取反
void setN(int n) {
/*
int a = n / 32;//n >> 5;
int b = n % 32;//n & 31;
bitmap[a] ^= (1 << b);
*/
bitmap[n >> 5] ^= (1 << (n & 31));
}
}
BitMap相关说明
使用int[]结构表示BitMap
//bitmap[0] 表示 31 ~ 00 位
//bitmap[1] 表示 63 ~ 32 位
//bitmap[2] 表示 95 ~ 64 位
即数组增序排列,单个int降序排列
使用位运算加快运算
num / 32 等效于 n >> 5
num % 32 等效于 n & 31
位运算比加减快,加减比乘除快
因此采用速度更快的 n >> 5 , n & 31
世界线回溯,从jvav到架构师