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