BitMap的java实现

来源:互联网 发布:js同源策略是什么意思 编辑:程序博客网 时间:2024/06/06 17:37
/** * 本文所实现的bitmap是将整型数字存储到整型数组中,主要是为了减少原始数字集合存储所占的空间 * @author djskl * */public class BitMap {private int[] data;//BitMapprivate final int BITS=32;//数组中的存储单元为32位private final int SHIFT=5;//2^5=32private final int MASK=0x1F;//0001 1111=31public BitMap(int nums){data=new int[1+nums/BITS];}/** * 向BitMap添加一个元素,其中value>>SHIFT和1<<(value&MASK)是实现映射的关键 * @param value */public void add(int value){int index=value>>SHIFT;//删掉低5位,相当于value/32int bit=1<<(value&MASK);//只保留低5位,相当于value%31,把1往右移(<value&MASK)位data[index]=data[index]|bit;}/** * 从bitmap中删除value * @param value */public void clr(int value){int index=value>>SHIFT;int bit=1<<(value&MASK);bit=~bit;data[index]=data[index]&bit;}/** * 从bitmap中寻找value * @param value * @return */public boolean find(int value){int index=value>>SHIFT;int bit=1<<(value&MASK);if((data[index]&bit)!=0)return true;elsereturn false;}public static void main(String[] args){BitMap bm=new BitMap(100);bm.add(23);bm.add(35);bm.add(24);bm.add(43);System.out.println(bm.find(20));}}

jdk也提供了BitSet的api方便大家使用:http://docs.oracle.com/javase/7/docs/api/java/util/BitSet.html

BitSet通过将某个index置为true/false来标示某个值是否被存储(通过set实现置位,通过get来判断当前index上是否有元素),还是对bitset进行与或非异或等操作。