本文是个人基于位图的理解,注释了他人代码,解释了代码的作用。
本文起到说明效果,为刚接触位图的人看,如果问题请留言指正。
package zljTest.test;
public class BitMap {
public static void main(String[] args) {
BitMap bm = new BitMap();
bm.setBit(15);
bm.setBit(5);
bm.setBit(14);
bm.setBit(8);
System.out.println(checkBit(5));
sortBitArray();
}
//位图存储的最大数字
private static int N = 16;
//一个int占用4byte=32bit,因此位图中一个元素表示32个数
private static int map[] = new int[N/32+1];
//封装几个方法方便调用
private static boolean checkBit(int val){
return checkBit(map,val);
}
private static void setBit(int val){
setBit(map,val);
}
private static void sortBitArray(){
sortBitArray(map);
}
//判断当前值是否存在
// & 位与 当前面二进制 与后面二进制中相同位置都是1则1 否则0
//比如5 判断100000(1<<5) 如果第六位都是1则证明5已经存放
private static boolean checkBit(int[] arr,int val){
return (arr[val/32] & (1<<val%32))!=0;
}
//放入位图方便实用 |= 位或等
//比如5 放入第一个对象 第六个0变为1(第一个是0的) 1<<5 = 32 二进制 100000
private static void setBit(int[] arr,int val){
arr[val/32] |= 1<<val%32;
}
//如果需要查看所有则需要循环最大值加一次的次数,判断位图中每个值是否都存在
public static void sortBitArray(int[] bitArray) {
int count = 0;
for (int i = 0; i <= N; i++) {
if (checkBit(bitArray, i)) {
System.out.print(count + "\t");
}
count++;
}
}
}