public class BitArray{//用byte数组模拟实现以个同步的bit一维数组
private byte[] array=null;
private int size=0;
//0xfe=11111110b;这个数和byte数与运算,第一位总会被置为0其他位不变
private byte[] zero = {(byte)0xfe,(byte)0xfd,(byte)0xfb,(byte)0xf7,(byte)0xef,(byte)0xdf,(byte)0xbf,(byte)0x7f};
//0x01=00000001b;这个数和任何数或运算,第一位总会被置为1其它位不变
private byte[] one = {(byte)0x01,(byte)0x02,(byte)0x04,(byte)0x08,(byte)0x10,(byte)0x20,(byte)0x40,(byte)0x80};
private final ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
private final Lock w = rwLock.writeLock();
private final Lock r = rwLock.readLock();
public BitArray(){
this(1024);
}
public BitArray(int size){
this.size = size;
array = (byte[])Array.newInstance(byte.class,size);
}
/**
* 往模拟的bit一维数组中插入值,
* @param index
* @param value true表示置为1,false表示置为0
* @return false表示失败,true表示成功
*/
public boolean set(int index,boolean value){
w.lock();
try{
//把bit的下标转换为 byte下标 和 游标
int byteIndex = index/8;
int cursor = index%8;
byte temp = array[byteIndex];
if(value==true){
temp = setOne(temp,cursor);
}else{
temp = setZero(temp,cursor);
}
array[byteIndex]=temp;
return true;
}catch(Throwable e){
e.printStackTrace();
return false;
}
finally{
w.unlock();
}
}
public byte get(int index){
r.lock();
try {
//把bit的下标转换为 byte下标 和 游标
int byteIndex = index/8;
int cursor = index%8;
byte temp = array[byteIndex];
return (byte) ((byte)(temp>>cursor)&0x1);
} catch (Throwable e) {
e.printStackTrace();
return -1;
}finally{
r.unlock();
}
}
public int size(){
return size;
}
/**
* 把byte的index位置为1
* @param b
* @param index
* @return
* 注:是从右往左index数值从0到8
*/
private byte setOne(byte b,int index){
return (byte) ((byte)b|one[index]);
}
/**
* 把byte的index位置为0
* @param b
* @param index
* @return
* 注:是从右往左index数值从0到8
*/
private byte setZero(byte b,int index){
return (byte) ((byte)b&zero[index]);
}
public static void main(String[] args) {
BitArray array = new BitArray(100000);
System.out.println(array.get(10000));
array.set(10000, true);
System.out.println(array.get(10000));
}
}
分享到:
相关推荐
c语言中的结构位数组的具体操作实现。位数组的应用范围很广的、
字符串转成byte[]后,与16进制字符的互转。
### 树状数组(Binary Indexed Tree,BIT)高效地处理动态的区间求和问题 #### 一、树状数组概述 树状数组(Binary Indexed Tree,简称 BIT)是一种高效的线性数据结构,主要应用于处理动态的区间求和问题。与传统...
gdi bmp bitbit dll array .
描述中提到的“读取第一页就被bit数组的排序方式吸引”,指的是书中介绍的一种高效的数据结构和算法应用。 Bit数组是一种非常节省空间的数据结构,它用单个比特(二进制位)来存储信息。在处理大量数据时,如果只...
这可以通过位操作,例如位移(bit shifting)和按位与(bitwise AND)、或(bitwise OR)等实现。 3. **串口通信**: - 串口通信是一种古老的通信方式,但仍然广泛应用于嵌入式系统和设备之间,如Arduino或...
在C#编程语言中,将byte数组转换为8bit灰度图像是一项常见且重要的技能,尤其是在处理图像数据或开发图像处理应用时。本文将详细解析这一过程,包括关键概念、技术细节以及具体实现步骤。 ### 关键概念 1. **8bit...
Bloom Filter是一种空间效率很高的数据索引结构,它利用bit数组很简洁地表示一个集合。Bloom Filter的主要用途是判断某个或某些元素是否属于某个集合,在判断是否属于某个集合时,有可能会把不属于这个集合的元素误...
uc8 Escalator8bit数组是用于存储8位无符号整数的数组。 RCC_Configuration函数 RCC_Configuration函数是用于配置STM32的时钟系统的函数。 GPIO_Configuration函数 GPIO_Configuration函数是用于配置STM32的GPIO...
Linge-互联网行业中Redis的应用.pptx==Redis应用讲解PPT文件。Redis(Remote Dictionary Server ),远程字典服务,是一个开源的使用C语言编写、...Bloom Filter 精度问题主要来自于有限的BIT数组大小和hash算法碰撞。
在DAC输出正弦波信号时,需要将Sine12bit数组传输到DAC通道,然后输出到外部电路。 DAC输出正弦波信号需要使用stm32微控制器的DAC通道、DMA通道、定时器等外设资源,并需要初始化DAC、DMA和定时器的参数。同时,...
- `HcodeType` 结构体用于存储编码信息,包括一个固定长度的bit数组和起始位置。 五、算法设计 1. 在构建哈夫曼树时,通过不断合并权值最小的节点来生成新的内部节点,直到所有叶节点合并成一棵树。 2. 求哈夫曼...
它首先清零计数器cnt,然后使用一个循环来将两个大整数相加,并将结果存储在bit数组中。 在减法运算中,使用了一个函数sub(),该函数将两个大整数相减,并将结果存储在BIG_INT结构体中。它首先清零计数器cnt,然后...
2. 将要编码的数据(如字符串、URL等)传递给encoder的Encode方法,生成编码后的Bit数组。 3. 使用Bit数组生成二维码图像,这通常涉及到将二进制数据转换为像素点,并根据黑白值填充图像。 识别二维码则是相反的...
布隆过滤器的原理是,首先分配一块内存空间做bit数组,数组的bit位初始值全部设为0。加入元素时,采用k个相互独立的Hash函数计算,然后将元素Hash映射的K个位置全部设置为1。检测key是否存在,仍然用这k个Hash函数...
该库使您可以将任何数值转换为字节或其他方式,也可以打印字节数组。使用此库时需要考虑的事项使用此库时,需要考虑可变的字节大小,因为如果使用的平台不同,则可能会出现一些错误,因为平台1上的int有4个字节,而...
例如,某些函数不能返回bit型值,bit型变量不能作为指针使用,也不能声明bit数组。 综上所述,在使用Keil模式设置和编程时,开发者需要深入了解C51的扩展关键字、内存区域、存储模式、存储类型声明、变量或数据类型...
大数据量、海量数据...Bit-map 使用 bit 数组,可以快速查找、判重、删除数据。 这些方法可以基本上处理绝大多数遇到的海量数据问题,但需要根据具体情况选择合适的方法,并且需要注意方法的实现细节和参数的选择。
bit-map 是一种使用 bit 数组来表示某些元素是否存在的数据结构,可以用来进行快速查找、判重、删除操作。其适用范围是数据范围是 int 的 10 倍以下。 问题实例 1. 给你 A,B 两个文件,各存放 50 亿条 URL,每条 ...