利用位图法操作海量数据
作者: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..) } } }