`
javaG
  • 浏览: 554920 次
  • 性别: 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));
	}

}

 

分享到:
评论

相关推荐

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

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

    bit与byte之间的互转

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

    树状数组(Binary Indexed Tree,BIT)高效地处理动态的区间求和问题

    ### 树状数组(Binary Indexed Tree,BIT)高效地处理动态的区间求和问题 #### 一、树状数组概述 树状数组(Binary Indexed Tree,简称 BIT)是一种高效的线性数据结构,主要应用于处理动态的区间求和问题。与传统...

    bitbit array

    gdi bmp bitbit dll array .

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

    描述中提到的“读取第一页就被bit数组的排序方式吸引”,指的是书中介绍的一种高效的数据结构和算法应用。 Bit数组是一种非常节省空间的数据结构,它用单个比特(二进制位)来存储信息。在处理大量数据时,如果只...

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

    这可以通过位操作,例如位移(bit shifting)和按位与(bitwise AND)、或(bitwise OR)等实现。 3. **串口通信**: - 串口通信是一种古老的通信方式,但仍然广泛应用于嵌入式系统和设备之间,如Arduino或...

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

    在C#编程语言中,将byte数组转换为8bit灰度图像是一项常见且重要的技能,尤其是在处理图像数据或开发图像处理应用时。本文将详细解析这一过程,包括关键概念、技术细节以及具体实现步骤。 ### 关键概念 1. **8bit...

    U201914927_陈雨轩1

    Bloom Filter是一种空间效率很高的数据索引结构,它利用bit数组很简洁地表示一个集合。Bloom Filter的主要用途是判断某个或某些元素是否属于某个集合,在判断是否属于某个集合时,有可能会把不属于这个集合的元素误...

    stm32的dac程序.doc

    uc8 Escalator8bit数组是用于存储8位无符号整数的数组。 RCC_Configuration函数 RCC_Configuration函数是用于配置STM32的时钟系统的函数。 GPIO_Configuration函数 GPIO_Configuration函数是用于配置STM32的GPIO...

    Linge-互联网行业中Redis的应用.pptx,Redis应用讲解PPT文件

    Linge-互联网行业中Redis的应用.pptx==Redis应用讲解PPT文件。Redis(Remote Dictionary Server ),远程字典服务,是一个开源的使用C语言编写、...Bloom Filter 精度问题主要来自于有限的BIT数组大小和hash算法碰撞。

    DAC输出正弦波

    在DAC输出正弦波信号时,需要将Sine12bit数组传输到DAC通道,然后输出到外部电路。 DAC输出正弦波信号需要使用stm32微控制器的DAC通道、DMA通道、定时器等外设资源,并需要初始化DAC、DMA和定时器的参数。同时,...

    huffman哈夫曼树编码译码课程设计报告.pdf

    - `HcodeType` 结构体用于存储编码信息,包括一个固定长度的bit数组和起始位置。 五、算法设计 1. 在构建哈夫曼树时,通过不断合并权值最小的节点来生成新的内部节点,直到所有叶节点合并成一棵树。 2. 求哈夫曼...

    高精度运算加法乘法减法除法算法

    它首先清零计数器cnt,然后使用一个循环来将两个大整数相加,并将结果存储在bit数组中。 在减法运算中,使用了一个函数sub(),该函数将两个大整数相减,并将结果存储在BIG_INT结构体中。它首先清零计数器cnt,然后...

    QR二维码生成与识别程序(C#2010)

    2. 将要编码的数据(如字符串、URL等)传递给encoder的Encode方法,生成编码后的Bit数组。 3. 使用Bit数组生成二维码图像,这通常涉及到将二进制数据转换为像素点,并根据黑白值填充图像。 识别二维码则是相反的...

    硬核 - Redis 布隆(Bloom Filter)过滤器原理与实战.doc

    布隆过滤器的原理是,首先分配一块内存空间做bit数组,数组的bit位初始值全部设为0。加入元素时,采用k个相互独立的Hash函数计算,然后将元素Hash映射的K个位置全部设置为1。检测key是否存在,仍然用这k个Hash函数...

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

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

    Keil模式设置和编程的事项

    例如,某些函数不能返回bit型值,bit型变量不能作为指针使用,也不能声明bit数组。 综上所述,在使用Keil模式设置和编程时,开发者需要深入了解C51的扩展关键字、内存区域、存储模式、存储类型声明、变量或数据类型...

    大数据量,海量数据-处理方法总结

    大数据量、海量数据...Bit-map 使用 bit 数组,可以快速查找、判重、删除数据。 这些方法可以基本上处理绝大多数遇到的海量数据问题,但需要根据具体情况选择合适的方法,并且需要注意方法的实现细节和参数的选择。

    常用大数据量,海量数据处理方法,算法总结

    bit-map 是一种使用 bit 数组来表示某些元素是否存在的数据结构,可以用来进行快速查找、判重、删除操作。其适用范围是数据范围是 int 的 10 倍以下。 问题实例 1. 给你 A,B 两个文件,各存放 50 亿条 URL,每条 ...

Global site tag (gtag.js) - Google Analytics