位图(BitMap)实现

位图(BitMap)实现

1. 位图简介

位图(BitMap)是一种高效的数据结构,用于存储和操作位(bit)数据。每个位可以表示一个布尔值(01),常用于去重、排序、快速查找等场景。


2. 核心功能 ⚙️

  • 设置位(Set):将某一位设置为 1
  • 清除位(Clear):将某一位设置为 0
  • 获取位(Get):检查某一位是否为 1
  • 打印位图(Print):以二进制形式打印位图。

3. 代码实现

package MyStruct;

import lombok.Data;

/**
 * @Author:丁浩然
 * @Package:MyStruct
 * @Project:leetcode_algorithm
 * @name:MyBitMap
 * @Date:2025/2/18 2:53
 * @Filename:MyBitMap
 * @Purpose:实现一个简单的位图(BitMap)数据结构,用于高效地存储和操作位数据。
 */
@Data
public class MyBitMap {
    // 位图数据存储在一个字节数组中,每个字节可以存储8位
    public final byte[] bits;

    /**
     * 构造函数,初始化位图
     *
     * @param size 位图的大小(位数)
     */
    public MyBitMap(int size) {
        // 计算需要的字节数,每个字节可以存储8位
        // 例如,size=16需要2个字节,size=17需要3个字节
        bits = new byte[(size + 7) / 8];
    }

    /**
     * 将指定位置的位设置为1
     *
     * @param pos 要设置的位置(从0开始)
     */
    public void set(int pos) {
        // 计算字节索引:pos / 8
        int index = pos / 8;
        // 计算位偏移:pos % 8
        int offset = pos % 8;
        // 使用位操作符 | 将特定位设置为1
        bits[index] |= (1 << offset);
    }

    /**
     * 将指定位置的位设置为0
     *
     * @param pos 要清除的位置(从0开始)
     */
    public void clear(int pos) {
        // 计算字节索引:pos / 8
        int index = pos / 8;
        // 计算位偏移:pos % 8
        int offset = pos % 8;
        // 使用位操作符 & 和 ~ 将特定位设置为0
        bits[index] &= ~(1 << offset);
    }

    /**
     * 获取指定位置的位值
     *
     * @param pos 要获取的位置(从0开始)
     * @return 如果该位为1,返回true;否则返回false
     */
    public boolean get(int pos) {
        // 计算字节索引:pos / 8
        int index = pos / 8;
        // 计算位偏移:pos % 8
        int offset = pos % 8;
        // 使用位操作符 & 检查特定位是否为1
        return (bits[index] & (1 << offset)) != 0;
    }

    /**
     * 打印位图的二进制表示
     */
    public void print() {
        for (int i = 0; i < bits.length; i++) {
            // 将字节转换为8位二进制字符串,高位补0
            String binaryString = String.format("%8s", Integer.toBinaryString(bits[i] & 0xFF)).replace(' ', '0');
            // 打印每个字节的二进制表示
            System.out.println(binaryString);
        }
    }
}

4. 流程图

以下是位图操作的流程图,使用 Mermaid 绘制:
位图(BitMap)实现_第1张图片

5. 示例运行

public class Main {
    public static void main(String[] args) {
        // 创建一个大小为16的位图
        MyBitMap bitMap = new MyBitMap(16);

        // 设置第3位和第5位为1
        bitMap.set(3);
        bitMap.set(5);

        // 打印位图的二进制表示
        bitMap.print();

        // 获取第3位和第4位的值
        System.out.println("Bit at position 3: " + bitMap.get(3));
        System.out.println("Bit at position 4: " + bitMap.get(4));

        // 清除第3位
        bitMap.clear(3);

        // 再次获取第3位的值
        System.out.println("Bit at position 3 after clear: " + bitMap.get(3));
    }
}

6. 输出结果

位图(BitMap)实现_第2张图片

7. 总结

  • 位图是一种高效的数据结构,适合处理大量布尔值。
  • 通过位操作符(|&~<<)可以快速设置、清除和检查特定位。

你可能感兴趣的:(bitmap,算法)