gitee.com/lh-her-team/common@v1.5.1/bitmap/bitmap.go (about)

     1  package bitmap
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  )
     7  
     8  //
     9  type Bitmap struct {
    10  	words []uint64
    11  }
    12  
    13  func min(a, b int) int {
    14  	if a < b {
    15  		return a
    16  	}
    17  	return b
    18  }
    19  
    20  func (bitmap *Bitmap) fillLen(length int) {
    21  	for len(bitmap.words) < length {
    22  		bitmap.words = append(bitmap.words, 0)
    23  	}
    24  }
    25  
    26  func (bitmap *Bitmap) Has(num int) bool {
    27  	word, bit := num/64, uint(num%64)
    28  	return word < len(bitmap.words) && (bitmap.words[word]&(1<<bit)) != 0
    29  }
    30  
    31  func (bitmap *Bitmap) Set(num int) *Bitmap {
    32  	word, bit := num/64, uint(num%64)
    33  	for word >= len(bitmap.words) {
    34  		bitmap.words = append(bitmap.words, 0)
    35  	}
    36  	// 判断num是否已经存在bitmap中
    37  	if bitmap.words[word]&(1<<bit) == 0 {
    38  		bitmap.words[word] |= 1 << bit
    39  	}
    40  	return bitmap
    41  }
    42  
    43  func (bitmap *Bitmap) InterExist(bitmap2 *Bitmap) bool {
    44  	if bitmap2 == nil {
    45  		return false
    46  	}
    47  	for i := 0; i < min(len(bitmap.words), len(bitmap2.words)); i++ {
    48  		if bitmap.words[i]&bitmap2.words[i] > 0 {
    49  			return true
    50  		}
    51  	}
    52  	return false
    53  }
    54  
    55  func (bitmap *Bitmap) Or(bitmap2 *Bitmap) {
    56  	if bitmap2 == nil {
    57  		return
    58  	}
    59  	bitmap.fillLen(len(bitmap2.words))
    60  	for i := 0; i < len(bitmap2.words); i++ {
    61  		bitmap.words[i] = bitmap.words[i] | bitmap2.words[i]
    62  	}
    63  }
    64  
    65  func (bitmap *Bitmap) Xor(bitmap2 *Bitmap) {
    66  	if bitmap2 == nil {
    67  		return
    68  	}
    69  	bitmap.fillLen(len(bitmap2.words))
    70  	for i := 0; i < len(bitmap2.words); i++ {
    71  		bitmap.words[i] = bitmap.words[i] ^ bitmap2.words[i]
    72  	}
    73  }
    74  
    75  func (bitmap *Bitmap) Clone() *Bitmap {
    76  	bitmap2 := &Bitmap{
    77  		words: make([]uint64, len(bitmap.words)),
    78  	}
    79  	for i, v := range bitmap.words {
    80  		bitmap2.words[i] = v
    81  	}
    82  	return bitmap2
    83  }
    84  
    85  // 所有为1的Pos
    86  func (bitmap *Bitmap) Pos1() []int {
    87  	var pos []int
    88  	for i, v := range bitmap.words {
    89  		if v == 0 {
    90  			continue
    91  		}
    92  		for j := uint(0); j < 64; j++ {
    93  			if v&(1<<j) != 0 {
    94  				pos = append(pos, 64*i+int(j))
    95  			}
    96  		}
    97  	}
    98  	return pos
    99  }
   100  
   101  func (bitmap *Bitmap) String() string {
   102  	var buf bytes.Buffer
   103  	buf.WriteByte('{')
   104  	for i, v := range bitmap.words {
   105  		if v == 0 {
   106  			continue
   107  		}
   108  		for j := uint(0); j < 64; j++ {
   109  			if v&(1<<j) != 0 {
   110  				if buf.Len() > len("{") {
   111  					buf.WriteByte(' ')
   112  				}
   113  				fmt.Fprintf(&buf, "%d", 64*i+int(j))
   114  			}
   115  		}
   116  	}
   117  	buf.WriteByte('}')
   118  	return buf.String()
   119  }