`
javaG
  • 浏览: 550144 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Bit数组

    博客分类:
  • java
阅读更多
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));
	}

}

 

分享到:
评论

相关推荐

    bit与byte之间的互转

    字符串转成byte[]后,与16进制字符的互转。

    bitbit array

    gdi bmp bitbit dll array .

    c语言中的位数组源码(bit array)

    c语言中的结构位数组的具体操作实现。位数组的应用范围很广的、

    8位数组转成16位数组.rar

    8位数组转成16位数组,使用串口通信,将一个字节转成2个字节数组,可以任意设定数组的大小,只要是单个字节的2的倍数就行。简单的小程序,方便实用。

    C#中将byte数组转换为8bit灰度图像

    C#中将byte数组转换为8bit灰度图像

    ByteConvert_arduino:Arduino的库,可将变量转换为字节并返回

    该库使您可以将任何数值转换为字节或其他方式,也可以打印字节数组。使用此库时需要考虑的事项使用此库时,需要考虑可变的字节大小,因为如果使用的平台不同,则可能会出现一些错误,因为平台1上的int有4个字节,而...

    bit.cpp(树状数组基本框架)

    bit.cpp(树状数组基本框架): 树状数组是一类比较简单的数据结构,和线段树比较像。树状数组是维护前缀和的一种数据结构。这就导致它能用较短的时间来实现查询和改变值。 树状数组比线段树、平衡树要容易写,代码...

    bitarray:golang的可变大小位数组

    数组基于零索引。 示例用法: 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语言数组

    可以将BMP图片转换为C语言数组,转换好的数组,图片的第一行数据在数组的最后一行,32bit的数据顺序为: pixel[0] = truecolor_logo_data[tmp+m+2]; pixel[1] = truecolor_logo_data[tmp+m+3]; pixel[2] = ...

    LabVIEW,字节数组至数值转换

    LabVIEW程序,功能:将4字节的unsigned char输入组合成1个32-bit int值,若输入字节数不等于4则报错。

    编程珠玑第二版中英源打包

    编程珠玑第二版中英源打包,经典的算法题,读取第一页的时候,深深地被使用bit数组对大数据量快捷的排序方式给吸引住了。。

    php-bitarray:PHP位数组

    该项目处理内部存储为字符串的位值的紧凑数组。 使用以下任一方法创建对象时,位数组可能具有指定的可变长度: 一个特定的大小; 可遍历的集合; 位的字符串表示形式; 位的json表示; 来自另一个位数组的...

    BitArray:Java的BitArray的无缝实现

    由于仍然无法从Array对象继承,因此要利用方括号语法(即customArray[index] ,如在本文中所述: 用Javascript将数组子类化从来都不是一件容易的事。 至少对于“对数组进行子类化”这样的含义而言。 奇怪的是,该...

    海量数据处理系列之:用C++实现Bitmap算法

    适用范围:可进行数据的快速查找,判重,删除,一般来说数据范围是int的10倍以下基本原理及要点:使用bit数组来表示某些元素是否存在,比如8位电话号码扩展:bloom filter可以看做是对bit-map的扩展问题实例:1)...

    RFID数据流近似去重

    也就是说,TBF用整数数组而不是一个bit数组。 TBF如图三所示。它使用k个相互独立的哈希函数(h1,h2,…..hk),如BF一样映射到(0,….,m-1).TBF第i个单元的值用M[i]表示。为了存储RFID数据x,找到h1(x.TagID),⋯,...

    C# 三种字节数组(byte[])拼接的性能对比测试

    C#中的三种字节数组拼接方式的性能对比测试DEMO。 博文地址:http://blog.csdn.net/sqqyq/article/details/50986977

    BIT_BYTE.zip_数组转换

    程序实现了整型数组到字符数组的相互转换功能

    树状数组(Binary Indexed Tree, BIT,或称 Fenwick Tree)

    树状数组(Binary Indexed Tree, BIT,或称 Fenwick Tree)是一种高效的数据结构,用于处理动态集合上的范围查询和单点更新问题,特别适用于维护数组的前缀和。在C#中实现树状数组时,主要关注以下操作: 单点更新...

    树状数组另一类用法(C++源码)

    一般BIT是单点查询,区域求和; 进阶一点的是区域加减,单点查询; 这里所说的是区域加减区域求和,包括一维树状数组以及二维树状数组。通过修改可以把求和改成求异或和等大部分具有结合律的运算。

Global site tag (gtag.js) - Google Analytics