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  }