Go语言按位非运算结果异常:输入128输出-129而非127求解
问题原因解析
在Go语言中,int类型是有符号整数,采用补码方式存储数值,这是结果不符合预期的核心原因:
- 当
n=128时,以32位系统为例,其二进制表示为:00000000 00000000 00000000 10000000 - 对有符号整数执行
^n(按位取反)操作时,会对所有位取反,得到:
这个二进制数作为补码,对应的十进制是**-129**(补码转原码:取反加1后得到11111111 11111111 11111111 0111111110000000 00000000 00000000 10000001,即-129)。 - 计算
n-1得到127,二进制是:00000000 00000000 00000000 01111111 - 执行
^n | (n-1)即-129 | 127,按位或的结果仍为**-129**,和实际输出一致。
解决方法
方法1:使用无符号整数类型
将参数和返回值改为uint,按位取反会针对无符号位操作,符合你的预期:
package main import "fmt" func SingleZeroBitAtRightMostOneBitPosition(n uint) uint { return ^n | (n - 1) } func main() { fmt.Println(SingleZeroBitAtRightMostOneBitPosition(128)) // 输出127 }
方法2:调整位运算逻辑(针对有符号整数)
如果必须使用int,可简化逻辑直接得到结果:
package main import "fmt" func SingleZeroBitAtRightMostOneBitPosition(n int) int { return n - 1 } func main() { fmt.Println(SingleZeroBitAtRightMostOneBitPosition(128)) // 输出127 }
因为对于n=128(即2的7次方),n-1正好是二进制01111111,对应十进制127。
内容的提问来源于stack exchange,提问作者Abdul Halim
相关产品推荐
相关产品推荐

