利用位图法操作海量数据
作者:bin位图法的原理主要就是利用int类型数据,一个int类型数据是4个字节,一个字节8位,然后一个int数据利用自身字节位就可以表示0-31的数是否存在,bit位表示数值,位山0,1值表示这个数值是否存在。

代码实现
package com.thread;
import java.util.*;
public class Solution {
public static void main(String[] args) {
Solution s = new Solution();
s.set(1000000, true);
s.set(2, true);
s.set(3, true);
System.out.println(s.get(1000000));
System.out.println(s.get(2));
System.out.println(s.get(3));
System.out.println(s.get(4));
System.out.println(s.get(5));
}
private byte[] bitmap = new byte[781250];
public boolean get(int number){
//获取位置
int site=number>>>3;//等价于 site=number/8
//获取该字节
byte temp = bitmap[site];
//获取该字节的第几个
int i=number&7;//等价于 i=number%8
//将这个字节数右移(7-i)位(也就是把要查找的位移动到最右侧),然后与 0000 0001相与
if(((temp>>>(7-i))&1)==0){
return false;
}
return true;
}
private void set(int number, boolean bool){
//获取位置
int site=number>>>3;//等价于 site=number/8
//获取该字节
byte temp=bitmap[site];
//获取该字节的第几个
int i=number&7;//等价于 i=number%8
//将0000 0001 左移(7-i)
byte comp= (byte) (1<<(7-i));
if(bool){//设置为1
bitmap[site]= (byte) (comp|temp);//取或(0.. 1 0..)
}else {//设置为0
comp= (byte) ~comp;//取反
bitmap[site]= (byte) (comp&temp);//相与(1.. 0 1..)
}
}
}