欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java -- Bitmap位图使用

程序员文章站 2022-07-10 17:32:48
文章目录1. 数据结构的定义2. 查询方法的实现3. 修改方法的实现在Java中使用byte[]字节数组来储存bit,1byte = 8bit。对于bit中的第i位,该bit为1则表示true,即数据存在:为0则表示false,即数据不存在。其具体实现分为数据结构的定义、查询方法和修改方法的实现1. 数据结构的定义...


         在Java中使用byte[]字节数组来储存bit,1byte = 8bit。对于bit中的第i位,该bit为1则表示true,即数据存在:为0则表示false,即数据不存在。其具体实现分为数据结构的定义、查询方法和修改方法的实现

1. 数据结构的定义

        在如下代码中定义了一个名为Bitmap的类用于位图数据结构的存储,其中byte[]数组用于存储具体的数据,length用于记录数据的长度:

	//以bit为存储单位的数据结构,对于给定的第i位,1表示true,0表示false
public class Bitmap{
	private byte[] bytes;
	//length为位图的长度,实际可操作的下标为[0,length)
	private int length;
	public Bitmap(int length){
		this.length = length;
		bytes = new byte[length%8==0 ? length/8 : length/8+1];
	}
}

2. 查询方法的实现

        位图的查询操作为在拿到目标bit所在的Byte后,将其向右位移(并将高位置0),是目标bit在第一位,这样结果值就是目标bit值,方法如下:

  1. 通过byte[index>>3](等价于byte[index/8])取到目标bit所在的Byte
  2. 令 i = index&7(等价于index%8),使得目标bit在该Byte中的位置
  3. 为了将目标bit前面的高位置0(这样位移后的值才等于目标bit本身),需要构建到目标bit为止的低位掩码,即01111111>>>(7-i),再与原Byte做&运算
  4. 将结果向右位移i位,使目标bit位处于第1位,结果值即为所求
//获取指定位的值
public boolean get(int index){
	int i = index & 7;
	//构建到index结束的低位掩码并做&运算(为了将高位置0),然后将结果一直右移,
	//直到目标位(index位)移到第一位,然后根据其值返回结果
	if((bytes[index >> 3] & (01111111 >>> (7-i))) >> i == 0)
		return false;
	else
		return true;
}

3. 修改方法的实现

        对位图的修改操作根据设定值true或false的不同,分为两种情况

  1. 如果value为true,则表示数据存在,将目标位与1做或运算,需要构建目标位为1、其他位为0的操作数
  2. 如果value为false,则表示数据不存在,将目标位与0做与运算,需要构建目标位为0、其他位为1的操作数。构建目标位为1且其他位为0的操作数的做法为:1 << (index & 7)
//设置指定位的值
public void set(int index, boolean value){
	if(value)
		//通过给定位index,先定位到对应的Byte,并根据value值进行不同位的操作:
		//1.如果value为true,则目标位应该做或运算,构建“目标位为1,
		//其他位为0”的操作数,为了只合理操作目标位,而不影响其他位
		//2.如果value为false,则目标位应该做与运算,构建“目标位为0,
		//其他位为1”的操作数
		bytes[index >> 3 ] |= 1 << (index & 7 );
		//byte[index/8] = byte[index/8] | (0b0001 << (index%8))
	else
		bytes[index >> 3 ] &= ~(1 << (index & 7 ));
}

本文地址:https://blog.csdn.net/weixin_44556968/article/details/110287626