为了账号安全,请及时绑定邮箱和手机立即绑定

使用数字文字但不使用数字常量的移位运算符会出错

使用数字文字但不使用数字常量的移位运算符会出错

Go
弑天下 2023-07-17 16:25:57
我在 go 中进行移位操作时遇到错误,invalid operation: 1 << bucketCntBits (shift count type int, must be unsigned integer)尝试在 go inside main()body 中声明文字时出错失败文字示例:https://play.golang.org/p/EqI-yag5yPpfunc main() {    bucketCntBits := 3 // <---- This doesn't work    bucketCnt     := 1 << bucketCntBits    fmt.Println("Hello, playground", bucketCnt)}当我将班次计数声明为常量时,班次运算符就起作用了。工作常量示例:https ://play.golang.org/p/XRLL4FR8ZElconst (    bucketCntBits = 3 // <---- This works)func main() {    bucketCnt     := 1 << bucketCntBits    fmt.Println("Hello, playground", bucketCnt)}为什么常量可以工作,而文字却不能用于移位运算符?
查看完整描述

3 回答

?
慕容3067478

TA贡献1773条经验 获得超3个赞

Go 1.13 发行说明(2019 年 9 月)

语言的变化

根据已签名的班次计数提案, Go 1.13 删除了班次计数必须无符号的限制。此更改消除了对许多人工 uint 转换的需要,这些转换仅仅是为了满足 << 和 >> 运算符的此(现已删除)限制而引入的。


invalid operation: 1 << bucketCntBits (shift count type int, must be unsigned integer)

对于 Go 1.13(2019 年 9 月)及更高版本,这不再是错误。

你的例子,

package main


import "fmt"


func main() {

    bucketCntBits := 3

    bucketCnt := 1 << bucketCntBits

    fmt.Println(bucketCnt)

}

输出:


$ go version

go version devel +66ff373911 Sat Aug 24 01:11:56 2019 +0000 linux/amd64


$ go run shift.go

8


查看完整回答
反对 回复 2023-07-17
?
慕标5832272

TA贡献1966条经验 获得超4个赞

或者,您可以将类型uint8, uint16,uint32或强制转换uint64为整数文字。例如,


func main() {

    bucketCntBits := uint32(3)

    bucketCnt     := 1 << bucketCntBits

    fmt.Println(bucketCnt)

}

输出:


8


查看完整回答
反对 回复 2023-07-17
?
慕雪6442864

TA贡献1812条经验 获得超5个赞

使用math/bits包你可以做这样的事情:


package main


import (

    "fmt"

    "math/bits"

)


func main() {

    bucketCntBits := 3

    bucketCnt     := bits.RotateLeft(1, bucketCntBits)

    fmt.Println("Hello, playground", bucketCnt)

}


https://play.golang.org/p/fVK2xysL896


查看完整回答
反对 回复 2023-07-17
  • 3 回答
  • 0 关注
  • 118 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信