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));
}
}
分享到:
相关推荐
字符串转成byte[]后,与16进制字符的互转。
gdi bmp bitbit dll array .
c语言中的结构位数组的具体操作实现。位数组的应用范围很广的、
8位数组转成16位数组,使用串口通信,将一个字节转成2个字节数组,可以任意设定数组的大小,只要是单个字节的2的倍数就行。简单的小程序,方便实用。
C#中将byte数组转换为8bit灰度图像
该库使您可以将任何数值转换为字节或其他方式,也可以打印字节数组。使用此库时需要考虑的事项使用此库时,需要考虑可变的字节大小,因为如果使用的平台不同,则可能会出现一些错误,因为平台1上的int有4个字节,而...
bit.cpp(树状数组基本框架): 树状数组是一类比较简单的数据结构,和线段树比较像。树状数组是维护前缀和的一种数据结构。这就导致它能用较短的时间来实现查询和改变值。 树状数组比线段树、平衡树要容易写,代码...
数组基于零索引。 示例用法: ary := bitarray.New(10)ary.IsSet(2) //falseary.Set(2)ary.IsSet(2) //trueary.String() // 0010000000ary.Unset(2)ary.IsUnset(2) //trueary.String() // 0000000000实际使用见...
可以将BMP图片转换为C语言数组,转换好的数组,图片的第一行数据在数组的最后一行,32bit的数据顺序为: pixel[0] = truecolor_logo_data[tmp+m+2]; pixel[1] = truecolor_logo_data[tmp+m+3]; pixel[2] = ...
LabVIEW程序,功能:将4字节的unsigned char输入组合成1个32-bit int值,若输入字节数不等于4则报错。
编程珠玑第二版中英源打包,经典的算法题,读取第一页的时候,深深地被使用bit数组对大数据量快捷的排序方式给吸引住了。。
该项目处理内部存储为字符串的位值的紧凑数组。 使用以下任一方法创建对象时,位数组可能具有指定的可变长度: 一个特定的大小; 可遍历的集合; 位的字符串表示形式; 位的json表示; 来自另一个位数组的...
由于仍然无法从Array对象继承,因此要利用方括号语法(即customArray[index] ,如在本文中所述: 用Javascript将数组子类化从来都不是一件容易的事。 至少对于“对数组进行子类化”这样的含义而言。 奇怪的是,该...
适用范围:可进行数据的快速查找,判重,删除,一般来说数据范围是int的10倍以下基本原理及要点:使用bit数组来表示某些元素是否存在,比如8位电话号码扩展:bloom filter可以看做是对bit-map的扩展问题实例:1)...
也就是说,TBF用整数数组而不是一个bit数组。 TBF如图三所示。它使用k个相互独立的哈希函数(h1,h2,…..hk),如BF一样映射到(0,….,m-1).TBF第i个单元的值用M[i]表示。为了存储RFID数据x,找到h1(x.TagID),⋯,...
C#中的三种字节数组拼接方式的性能对比测试DEMO。 博文地址:http://blog.csdn.net/sqqyq/article/details/50986977
程序实现了整型数组到字符数组的相互转换功能
树状数组(Binary Indexed Tree, BIT,或称 Fenwick Tree)是一种高效的数据结构,用于处理动态集合上的范围查询和单点更新问题,特别适用于维护数组的前缀和。在C#中实现树状数组时,主要关注以下操作: 单点更新...
一般BIT是单点查询,区域求和; 进阶一点的是区域加减,单点查询; 这里所说的是区域加减区域求和,包括一维树状数组以及二维树状数组。通过修改可以把求和改成求异或和等大部分具有结合律的运算。