-
Notifications
You must be signed in to change notification settings - Fork 0
/
x_bitmap.go
58 lines (49 loc) · 1002 Bytes
/
x_bitmap.go
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
package bitmap
import "bytes"
const (
maxBitMapSize = 1 << 32
)
type x32Bitmap struct {
bits []byte
size uint64
}
func NewX32Bitmap(size uint64) Bitmap {
if size <= 0 || size > maxBitMapSize {
size = maxBitMapSize
}
if remainder := size & 0x07; remainder != 0 {
size = size + (8 - remainder)
}
return &x32Bitmap{
bits: make([]byte, size>>3),
size: size - 1,
}
}
func (bm *x32Bitmap) SetBit(offset uint64, one bool) bool {
idx, pos := offset>>3, offset&0x07
if bm.size < offset {
return false
}
if !one {
bm.bits[idx] &= ^(1 << pos) // &^=
} else {
bm.bits[idx] |= 1 << pos
}
return true
}
func (bm *x32Bitmap) GetBit(offset uint64) bool {
idx, pos := offset>>3, offset&0x07
if bm.size < offset {
return false
}
return bm.bits[idx]>>pos != 0
}
func (bm *x32Bitmap) GetBits() []byte {
return bm.bits
}
func (bm *x32Bitmap) EqualTo(that Bitmap) bool {
return bytes.Compare(bm.GetBits(), that.GetBits()) == 0
}
func (bm *x32Bitmap) Free() {
clear(bm.bits)
}