Go语言位与和左移运算返回非预期结果问题咨询
问题根因
你遇到的问题是对Go语言的运算符优先级和结合性规则理解错误导致的。
Go语言中,位与运算符&和左移运算符<<属于同一优先级,同优先级的二元运算符遵循从左到右的左结合规则,因此你写的表达式score&1<<shifter不会按照你预期的score & (1 << shifter)顺序计算,实际的运算顺序是(score & 1) << shifter。
实际运算过程推演
- 先计算
score & 1:score的值为5,二进制表示为101,和1(二进制001)做位与运算的结果为1 - 再计算
1 << shifter:shifter值为3,1左移3位的结果为8
最终整个表达式的结果就是8,和你实际运行得到的结果一致。
修复方案
给移位运算部分手动加括号,明确指定运算顺序即可得到预期结果:
func main() { var score int = 5 var shifter int = 3 if score&(1<<shifter) != 0 { fmt.Println(score, 1<<shifter, score&(1<<shifter)) } else { fmt.Println("false") } }
修改后运行会输出false,符合你的初始预期。
内容的提问来源于stack exchange,提问作者user2684533
相关产品推荐
相关产品推荐

