要求
用Java来实现个Bitmap,实现两个方法,put方法往里面插入数据,exist方法判断value在位图里是否存在。不能用Java的工具类,你要自己写个byte数组来实现
代码实现和解释说明
public class BitMap {
private byte[] bitmap;
private int size;
public BitMap(int size) {
this.size = size;
this.bitmap = new byte[(size >> 3) + 1];
}
public void put(int value) {
if (value < 0 || value > size) {
throw new IllegalArgumentException("Value out of range");
}
//等价 value / 8 确定在数组的下标
int byteIndex = value >> 3;
//等价 value % 8 确定在byte元素中的下标
int bitIndex = value & 7;
//是位或赋值运算,作用是将对应位设置为 1,而其他位保持不变
// 1 << bitIndex 将对应位置设为1,如value是3,则值为 00001000;
bitmap[byteIndex] |= (1 << bitIndex);
}
public boolean exist(int value) {
if (value < 0 || value > size) {
throw new IllegalArgumentException("Value out of range");
}
//等价 value / 8 确定在数组的下标
int byteIndex = value >> 3;
//等价 value % 8 确定在byte元素中的下标
int bitIndex = value & 7;
return (bitmap[byteIndex] & (1 << bitIndex)) != 0;
}
}
位图核心原理:
- 使用
byte数组,每个byte有 8 位,可以存储 8 个布尔值(是否存在)。 对于整数值
value,计算它在数组中的位置:byteIndex = value / 8:找到它属于哪个字节。bitIndex = value % 8:找到字节中的哪一位。
利用位操作设置或检查相应位。
put方法:- 使用位操作
|=将对应位设置为1。exist方法: - 使用位操作
&检查对应位是否为1。
边界检查: - 如果
value超出范围,会抛出IllegalArgumentException。
bitmap[byteIndex] |= (1 << bitIndex)解释说明:
|=是位或赋值运算,作用是将对应位设置为 1,而其他位保持不变。- 位或操作的规则是:只要其中一位为 1,结果就是 1。
- 举例:
- 假设
bitmap[byteIndex] = 00000010(二进制)。 - 如果
bitIndex = 3,那么1 << 3 = 00001000。 - 位或操作:
00000010 | 00001000 = 00001010。
- 假设
- 最终的效果是,
bitmap[byteIndex]的bitIndex位被置为 1,其余位保持原样。
后续
位图的理解暂时先写代码实现,后面还有根据位图做海量数据去重,以及JDK里BitSet的具体源码实现内容,有时间的时候再写写。