package JavaBasic;/**
* @Classname BitMap
* @Description å®ç°BItMapï¼å®é
æè·¯å°±æ¯ç¨ä¸ä½æ¥åå¨ä¸ä¸ªå¼ï¼ä½¿ç¨BIT_VALUE
* @Date 19-6-19 ä¸å7:49
* @Created by mao
*/
public class BitMap {
/** æå
¥æ°çæå¤§é¿åº¦ï¼æ¯å¦100ï¼é£ä¹å
许æå
¥bitsMapä¸çæå¤§æ°ä¸º99 */
private long length;
//æ¯ä¸ä¸ªint表示32ä½
private static int[] bitsMap;
//é¿åº¦ä¸º32,0-31æ¯ä¸ä½åç¬ä¸º1çæ¶åçæ°å¼
private static final int[] BIT_VALUE = { 0x00000001, 0x00000002, 0x00000004, 0x00000008, 0x00000010, 0x00000020,
0x00000040, 0x00000080, 0x00000100, 0x00000200, 0x00000400, 0x00000800, 0x00001000, 0x00002000, 0x00004000,
0x00008000, 0x00010000, 0x00020000, 0x00040000, 0x00080000, 0x00100000, 0x00200000, 0x00400000, 0x00800000,
0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000, 0x20000000, 0x40000000, 0x80000000 };
//é¿åº¦çäºæå¤§æ°é¤ä»¥32
public BitMap(long length) {
this.length = length;
// æ ¹æ®é¿åº¦ç®åºï¼æéæ°ç»å¤§å°
bitsMap = new int[(int) (length >> 5) + ((length & 31) > 0 ? 1 : 0)];
}
/**
* æ ¹æ®é¿åº¦è·åæ°æ® æ¯å¦è¾å
¥63ï¼é£ä¹å®é
䏿¯ç¡®å®æ°62æ¯å¦å¨bitsMapä¸
*
* @return index æ°çé¿åº¦
* @return 1:代表æ°å¨å
¶ä¸ 0:代表
*/
public int getBit(long index) {
if (index < 0 || index > length) {
throw new IllegalArgumentException("length value illegal!");
}
int intData = (int) bitsMap[(int) ((index - 1) >> 5)];
//(index - 1) & 31è¡¨ç¤ºçæ¯åç§»
//((intData & BIT_VALUE[(int) ((index - 1) & 31)]))表示è¿ä¸ªå¼åå¨ä¸åå¨
//å³ç§»æ¯ä¸ºäºå°æ°å¼è½¬æ¢å°0å1ä¹é´
return ((intData & BIT_VALUE[(int) ((index - 1) & 31)])) >>> ((index - 1) & 31);
}
/**
* @param index
* è¦è¢«è®¾ç½®çå¼ä¸ºindex - 1
*/
public void setBit(long index) {
//鲿¢è¶ç
if (index < 0 || index > length) {
throw new IllegalArgumentException("length value illegal!");
}
// æ±åºè¯¥index - 1æå¨bitMapç䏿
int belowIndex = (int) ((index - 1) >> 5);
// æ±åºè¯¥å¼çåç§»é(æ±ä½)
int offset = (int) ((index - 1) & 31);
//inDataæ¯ä¸ä¸ªå¤§çæ´æ°
int inData = bitsMap[belowIndex];
//å°ç¹å®ä½ç½®ä¸º1
bitsMap[belowIndex] = inData | BIT_VALUE[offset];
}
public static void main(String[] args) {
//设置æå¤§ç表示èå´
BitMap bitMap = new BitMap(63);
bitMap.setBit(63);
bitMap.setBit(62);
System.out.println(bitMap.getBit(63));
System.out.println(bitMap.getBit(62));
}
}