-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathbit.go
59 lines (47 loc) · 1.09 KB
/
bit.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
59
package utilx
import (
"strconv"
"strings"
)
// 位运算相关,字典code转为64位的位置整数
func MoveBitInt(code int, bitLen int) (int, uint64) {
if code == 0 {
return 0, 0
}
code--
group := code / bitLen
bitIndex := code % bitLen
var bitVal uint64
bitVal = 1 << uint64(bitIndex)
//log.Println("++++++", bitVal)
return group, bitVal
}
//将 1,2,3转为 位运算字符串
func MoveBitString(val string, bitLen int) string {
if val == "0" || val == "" {
return "0"
}
cells := strings.Split(val, ",")
cells = SliceUniqueString(cells)
//log.Println(cells)
maxElem := SliceMaxString(cells)
rsLen := (maxElem / bitLen)
if maxElem%bitLen > 0 {
rsLen = rsLen + 1
}
rs := make([]uint64, rsLen)
slen := len(cells)
for i := 0; i < slen; i++ {
code, _ := strconv.Atoi(cells[i])
group, val := MoveBitInt(code, 60)
rs[group] += val
}
// log.Println(rs)
rsStrSlice := make([]string, rsLen)
for i := 0; i < rsLen; i++ {
// codeStr := strconv.Itoa(rs[i])
codeStr := strconv.FormatUint(rs[i], 10)
rsStrSlice[i] = codeStr
}
return strings.Join(rsStrSlice, "|")
}