用bit位存储状态,golang获取,设置,转换bit位值

// 入参: 切片(二进制对应位)
// 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
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在 Go 语言中,获取切片最后一的方法是使用索引 -1。例如: ``` s := []int{1, 2, 3, 4} last := s[len(s)-1] ``` 上面的代码将获取到切片 `s` 的最后一的值,并将其存储在变量 `last` 中。 注意,这种方法仅适用于切片的长度大于 0 的情况。如果切片的长度为 0,那么访问切片最后一的值就会导致索引越界错误。因此,在使用这种方法之前,建议先判断切片的长度是否大于 0。 ### 回答2: 在golang中,可以使用切片的索引来获取其最后一。 首先,需要了解切片的基本概念。切片是由连续的元素构成的序列,其中每个元素都被分配了一个索引。切片的索引从0开始,到切片长度减1为止。 要获取切片的最后一,可以使用切片的索引方法。由于切片的长度可以是变化的,可以通过切片长度减1来获取最后一的索引。然后,通过访问该索引即可获取最后一的值。 示例如下: ```go package main import "fmt" func main() { // 创建一个切片 letters := []string{"a", "b", "c", "d", "e"} // 获取切片的最后一 last := letters[len(letters)-1] fmt.Println("切片的最后一是:", last) } ``` 在上述代码中,我们创建了一个字符串切片 `letters`,然后使用 `len(letters)-1` 来获取切片的最后一个索引。最后,通过 `letters[last]` 来获取最后一的值。 输出结果为: ``` 切片的最后一是: e ``` 以上就是使用golang获取切片最后一的方法。 ### 回答3: 在Go语言中,可以通过索引来获取切片的最后一。 首先,我们需要了解切片的索引。切片的索引从0开始,切片的最后一的索引可以通过切片长度减1得到。比如有一个切片slice,可以通过slice[len(slice)-1]来获取最后一元素。 下面是一个简单的示例代码: ``` package main import "fmt" func main() { // 定义一个切片 slice := []int{1, 2, 3, 4, 5} // 获取切片的最后一 last := slice[len(slice)-1] // 打印最后一元素 fmt.Println(last) } ``` 运行这段代码会输出结果5,因为最后一元素是5。 通过这种方式,我们可以获取任意切片的最后一元素。注意,如果切片为空,即长度为0,那么这种方式会导致数组越界错误。在实际使用中,我们应该先判断切片长度是否大于0,再去获取最后一元素,以避免这种错误的发生。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yilukuangpao

你的鼓励是我创造最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值