Bit数组

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));
	}

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值