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