BitMap实现

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值