初级--06---位图
Posted 高高for 循环
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初级--06---位图相关的知识,希望对你有一定的参考价值。
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
位图
定义:
- 位图,就是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况。通常是用来判断某个数据存不存在的。
- 位图,就是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况。通常是用来判断某个数据存不存在的
>> 6的含义
>> 6 等于 /64
右移6位 等同于 除以64,也就是除以 2^6的意思
取模运算 转化为 位运算
若满足b为2的整数次幂(即b=1<<k,k为整数)时,可用一个特殊的小技巧将取模运算转化为位运算,
a%b = a&(b-1) ,且b=1<<k(k为整数)
位运算 比加减乘除,取模效率上高很多
位图的实现
1. 构造函数:
max 为需要存储的元素个数和
// 这个类的实现是正确的
public static class BitMap
private long[] bits;
public BitMap(int max)
bits = new long[(max + 64) >> 6];
- 一个long类型的数字,可以存64位数字
- (max + 64) >> 6 看需要多少个long类型的数字
2. add操作
public void add(int num)
bits[num >> 6] |= (1L << (num & 63));
- num >> 6 判断是第几个long类型的区间
- 取模64 等于 (num & 63) 看 对应区间的 具体哪个位置上
将对应的比特位置赋值为1
位或运算
bits[num >> 6] = bits[num >> 6] | (1L << (num & 63));
bits[num >> 6] |= (1L << (num & 63));
3. delete操作
public void delete(int num)
bits[num >> 6] &= ~(1L << (num & 63));
将对用的比特位置0操作
4. contains操作
public boolean contains(int num)
return (bits[num >> 6] & (1L << (num & 63))) != 0;
判断对应的比特位是0(不存在)还是1(存在)
总代码
public static class BitMap
private long[] bits;
public BitMap(int max)
bits = new long[(max + 64) >> 6];
public void add(int num)
bits[num >> 6] |= (1L << (num & 63));
public void delete(int num)
bits[num >> 6] &= ~(1L << (num & 63));
public boolean contains(int num)
return (bits[num >> 6] & (1L << (num & 63))) != 0;
测试
public static void main(String[] args)
System.out.println("测试开始!");
int max = 10000;
BitMap bitMap = new BitMap(max);
HashSet<Integer> set = new HashSet<>();
int testTime = 10000000;
for (int i = 0; i < testTime; i++)
int num = (int) (Math.random() * (max + 1));
double decide = Math.random();
if (decide < 0.333)
bitMap.add(num);
set.add(num);
else if (decide < 0.666)
bitMap.delete(num);
set.remove(num);
else
if (bitMap.contains(num) != set.contains(num))
System.out.println("Oops!");
break;
for (int num = 0; num <= max; num++)
if (bitMap.contains(num) != set.contains(num))
System.out.println("Oops!");
System.out.println("测试结束!");
以上是关于初级--06---位图的主要内容,如果未能解决你的问题,请参考以下文章
[AndroidStudio]_[初级]_[配置自动完成的代码片段]