自学Java day53 使用jvav实现 BitMap 数据结构 从jvav到架构师

此BitMap不是指图片存储格式里的位图。

Bit即比特,是目前计算机系统里边数据的最小单位,8个bit即为一个Byte。一个bit的值,或者是0,或者是1;也就是说一个bit能存储的最多信息是2。

BitMap可以理解为通过一个bit数组来存储特定数据的一种数据结构;由于bit是数据的最小单位,所以这种数据结构往往是非常节省存储空间。

//可用于布隆过滤器
//样本量 n 失误率p 哈希函数 k
//m = -(n * lnp) / (ln2)^2
//k = ln2 * m/n ≈ 0.7 * m/n (向上取整)
public class BitMap {

    public int[] bitmap;

    //[0] 31 ~ 00
    //[1] 63 ~ 32
    //[2] 95 ~ 64
    //a % b = a & (b-1)(b=2^n)
    //即:a % (2^ n) = a & (2^n-1)
    public BitMap(int length) {
        //int = 32
        this.bitmap = new int[length];
    }

    @Override
    public String toString() {
        return "BitMap{" +
                "bitmap=" + Arrays.toString(bitmap) +
                '}';
    }

    //取得BitMap第n位
    int get(int n) {
        /*
        int a = num / 32;//n >> 5;
        int b = num % 32;//n & 31;
        int c = (bitmap[a] >> b) & 1;
        */
        return (bitmap[n >> 5] >> (n & 31)) & 1;
    }

    //将BitMap第n位设置为0
    void set0(int n) {
        /*
        int a = n / 32;//n >> 5;
        int b = n % 32;//n & 31;
        bitmap[a] &= ~(1 << b);
        */
        bitmap[n >> 5] &= ~(1 << (n & 31));
    }

    //将BitMap第n位设置为1
    void set1(int n) {
        /*
        int a = n / 32;//n >> 5;
        int b = n % 32;//n & 31;
        bitmap[a] |= (1 << b);
        */
        bitmap[n >> 5] |= (1 << (n & 31));
    }

    //将BitMap第n位取反
    void setN(int n) {
        /*
        int a = n / 32;//n >> 5;
        int b = n % 32;//n & 31;
        bitmap[a] ^= (1 << b);
        */
        bitmap[n >> 5] ^= (1 << (n & 31));
    }

}

BitMap相关说明 

使用int[]结构表示BitMap

    //bitmap[0] 表示 31 ~ 00 位
    //bitmap[1] 表示 63 ~ 32 位
    //bitmap[2] 表示 95 ~ 64 位

即数组增序排列,单个int降序排列

使用位运算加快运算

        num / 32    等效于  n >> 5
        num % 32  等效于  n & 31

位运算比加减快,加减比乘除快

因此采用速度更快的  n >> 5 , n & 31

世界线回溯,从jvav到架构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值