【BitMap】 java中实现BitMap位图 byte数组实现的bitmap位图

 

 转载自: https://blog.csdn.net/heshiyuan1406146854/article/details/122687988

 

package com.sxd.swapping.utils;

import java.util.ArrayList;
import java.util.List;

/**
 * byte数组实现的bitmap
 *
 * @author SXD
 * @date 2024/11/21
 */
public class MyBitmap {
    private byte[] buckets;

    public MyBitmap(int maxNum) {
        this.init(maxNum);
    }

    private void init(int maxNum) {
        int maxBucketIndex = this.getBucketIndex(maxNum);
        this.buckets = new byte[maxBucketIndex + 1];
    }

    public void add(int num) {
        int bucketIndex = this.getBucketIndex(num);
        int bitIndex = this.getBucketInnerBitIndex(num);
        this.buckets[bucketIndex] |= 1 << bitIndex;
    }

    public boolean contains(int num) {
        int bucketIndex = this.getBucketIndex(num);
        int bitIndex = this.getBucketInnerBitIndex(num);
        return (this.buckets[bucketIndex] & 1 << bitIndex) != 0;
    }

    /**
     * 一个byte数组 8个bit,因此可以理解为 数组长度为8
     * 如果超过8,则进行扩容,扩容为16个bit,即 两个byte数组,即1号数组和2号数组 ,直至 N号数组
     *
     * num >> 3 相当于 num / 8 ,算出num应该放在几号数组
     * @param num
     * @return int
     */
    private int getBucketIndex(int num) {
        return num >> 3;
    }

    /**
     * num & 0x07 相当于 num % 8 ,
     * 算出num应该放在几号数组的第几个位置
     * @param num
     * @return
     */
    private int getBucketInnerBitIndex(int num) {
        return num & 0x07;
    }



    public static void main(String[] args) {
        MyBitmap bitmap = new MyBitmap(1000);
        List<Integer> ids = new ArrayList<>();
        ids.add(1);
        ids.add(2);
        ids.add(3);
        ids.add(15);
        ids.add(23);
        ids.add(24);
        ids.add(25);
        ids.add(30);
        ids.add(49);
        ids.add(50);
        for (Integer id : ids) {
            bitmap.add(id);
            for (int i = 1; i <= 50; i++) {
                if (bitmap.contains(i)) {
                    System.out.println(i + "存在");
                } else {
                    System.out.println(i + "不存在");
                }
            }
        }
    }
}

 

 

 

测试:

 MyBitmap bitmap = new MyBitmap(1000);
        List<Integer> ids = new ArrayList<>();
        ids.add(1);
        ids.add(2);
        ids.add(3);
        ids.add(15);
        ids.add(23);
        ids.add(24);
        ids.add(25);
        ids.add(30);
        ids.add(49);
        ids.add(50);
        for (Integer id : ids) {
            bitmap.add(id);
            for (int i = 1; i <= 50; i++) {
                if (bitmap.contains(i)) {
                    System.out.println(i + "存在");
                } else {
                    System.out.println(i + "不存在");
                }
            }
        }

 

posted @ 2024-11-21 19:06  Angel挤一挤  阅读(5)  评论(0编辑  收藏  举报