位图(BitMap)是一种高效的数据结构,用于存储和操作位(bit)数据。每个位可以表示一个布尔值(0
或 1
),常用于去重、排序、快速查找等场景。
1
。0
。1
。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);
}
}
}
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));
}
}
|
、&
、~
、<<
)可以快速设置、清除和检查特定位。