forked from damaohongtu/JavaInterview
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathBitMap.java
More file actions
80 lines (65 loc) · 2.75 KB
/
BitMap.java
File metadata and controls
80 lines (65 loc) · 2.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package JavaBasic;/**
* @Classname BitMap
* @Description 实现BItMap,实际思路就是用一位来存储一个值,使用BIT_VALUE
* @Date 19-6-19 下午7:49
* @Created by mao<tianmao818@qq.com>
*/
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));
}
}