// 入参: 切片(二进制对应位)
// 1,2,3,4 对应的二进制 00001111// 结果: 7
func SliceToOb(d []int) int {
res := 0
for _, v := range d {
res |= 1 << (v - 1)
}
return res
}
// 入参: 十进制数
// 将十进制数转换为二进制1对应位
// 运算过程:
// 12&1 (12 >> 1) 即为 6&1 (6 >> 1) 3&1 (3>>1) 1&1 (1>>1) 0// 00001100 00000110 00000011 00000001
// & 0001 & 0001 & 0001 & 0001
// --------- ---------- -------- --------
// 00000000 00000000 00000001 00000001
// 为0不记录位置信息 为0不记录位置信息 为1记录位置信息 为1记录位置信息 为0则遍历位置结束
// 开始下一位二级制计算
// ObToSlice 结果: [1,3]
func ObToSlice(d int) []int {
res := make([]int, 0)
i := 1
flag := true
for flag {
if d == 0 {
flag = false
break
}
if d&1 != 0 {
res = append(res, i)
}
i++
d = d >> 1
}
return res
}
// 查询集合位置的所有子集
func findAllSubLocLen(set []int) int {
// 将集合拆分为子集应有 2^(集合长度-1) 个子集
setLen, _ := strconv.ParseFloat(fmt.Sprintf("%d", len(set)), 64)
subLen := int(math.Pow(2.0, setLen))
return subLen
}
// 查询需要查询元素的位置对应的二进制 转换后的十进制数
// 入参: 需要查询的数 如:3
// 找出3在集合中的位置, 0100
func findSubLoc(set []int, f int) int {
targetLoc := 0
for k, v := range set {
if v == f {
targetLoc = 1 << (k)
break
}
}
return targetLoc
}
func GetSearchSet(baseSet []int, s int) []int {
targetLoc := findSubLoc(baseSet, s)
n := findAllSubLocLen(baseSet)
subLoc := make([]int, 0)
for i := 0; i < n; i++ {
// 如果查找位置与位置子集相与为查找位置, 则记录该子集
if targetLoc&i == targetLoc {
subLoc = append(subLoc, i)
}
}
return subLoc
}