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 }