github.com/benz9527/toy-box/algo@v0.0.0-20240221120937-66c0c6bd5abd/bitmap/x_bitmap.go (about) 1 package bitmap 2 3 import "bytes" 4 5 const ( 6 maxBitMapSize = 1 << 32 7 ) 8 9 type x32Bitmap struct { 10 bits []byte 11 size uint64 12 } 13 14 func NewX32Bitmap(size uint64) Bitmap { 15 if size <= 0 || size > maxBitMapSize { 16 size = maxBitMapSize 17 } 18 if remainder := size & 0x07; remainder != 0 { 19 size = size + (8 - remainder) 20 } 21 return &x32Bitmap{ 22 bits: make([]byte, size>>3), 23 size: size - 1, 24 } 25 } 26 27 func (bm *x32Bitmap) SetBit(offset uint64, one bool) bool { 28 idx, pos := offset>>3, offset&0x07 29 if bm.size < offset { 30 return false 31 } 32 if !one { 33 bm.bits[idx] &= ^(1 << pos) // &^= 34 } else { 35 bm.bits[idx] |= 1 << pos 36 } 37 return true 38 } 39 40 func (bm *x32Bitmap) GetBit(offset uint64) bool { 41 idx, pos := offset>>3, offset&0x07 42 if bm.size < offset { 43 return false 44 } 45 return bm.bits[idx]>>pos != 0 46 } 47 48 func (bm *x32Bitmap) GetBits() []byte { 49 return bm.bits 50 } 51 52 func (bm *x32Bitmap) EqualTo(that Bitmap) bool { 53 return bytes.Compare(bm.GetBits(), that.GetBits()) == 0 54 } 55 56 func (bm *x32Bitmap) Free() { 57 clear(bm.bits) 58 }