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

}

 

你可能感兴趣的:(bit)