int类型32位,只能表示一个整数,而用BitMap可以表示32个数:
int[] bitArr:
bitMap[0]:可以表示数字0~31
比如表示0:00000000 00000000 00000000 00000000
比如表示1 : 00000000 00000000 00000000 00000001
bitMap[1]:可以表示数字32~63
bitMap[2]:可以表示数字64~95
……
因此要将一个数插入到bitMap中要进过三个步骤:
seg = 32
(1)找到所在bitMap数组下标
比如我们要在第64一个位置上插入一个数据(也就是插入63)
index = 63 >> 5 // 右移5位,即除以32,找到所在“段”
63 >> 5=1,即63应该插入到bitMap[1]中。
(2)偏移位置
offset = 63 & (seg-1)// “段”内位置
63 & 31=31,即63在bitMap[1]中第32位,也是最高位
(3)将32位置1
bitMap[1] | (1<<offset)
某位置0: 按位 “&”0,11111101,0的位置为想要置0的所在数的位置.
某位置1: 按位 “|”1,00000010,1的位置为想要置1的所在数的位置.
查看某位是否为1: 按位“&”1,00001000,1的位置即查看位。
查看某位是否为0: 按位“|”0,11110111,0的位置即查看位。
代码示例:
public class BitMap {
int[] bitArr;
int size;
int seg = 32;// 一个整数4字节,32位
int mod_bit = 5; // 取32的模,即向右移动5位
/**
* 默认数组大小:32个int型
*/
public BitMap() {
bitArr = new int[1 << mod_bit];
size = bitArr.length;
}
/**
*
* @param bitNum
* : 需要的最多bit位,即bitNum对应最大的数
*/
public BitMap(int bitNum) {
int len = (bitNum >> mod_bit) + 1;
bitArr = new int[len];
size = bitArr.length;
}
public void set(int data) {
int index = data >> mod_bit;// 找到所在“段”
int offset = (data - 1) & (seg - 1);// 找到“段内位置”
bitArr[index] |= 1 << offset;
}
public int get(int data) {
int index = data >> mod_bit;
int offset = (data - 1) & (seg - 1);
return (bitArr[index] & (1 << offset)) != 0 ? 1 : 0;
}
}
测试:
public static void main(String[] args) {
BitMap bitMap = new BitMap(35);
bitMap.set(33);
bitMap.set(2);
bitMap.set(13);
System.out.println(bitMap.get(33));
System.out.println(bitMap.get(2));
System.out.println(bitMap.get(1));
System.out.println(bitMap.get(13));
}
输出:
1
1
0
1
读取数组bitArr所有为1的下标,即为有序数列:
public void getSort() {
for (int i = 0; i < bitArr.length; i++) {// 行是数组长度
for (int j = 0; j < 32; j++) {// 列是int型的32位
if ((bitArr[i] & (1 << j)) != 0) {// 判断对应位是否为1,即是否不为0
System.out.print(i * seg + j + 1 + " ");
}
}
}
}
输出:
2 13 33