You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言按位非运算结果异常:输入128输出-129而非127求解

问题原因解析

在Go语言中,int类型是有符号整数,采用补码方式存储数值,这是结果不符合预期的核心原因:

  • 当n=128时,以32位系统为例,其二进制表示为:
    00000000 00000000 00000000 10000000
    
  • 对有符号整数执行^n(按位取反)操作时,会对所有位取反,得到:
    11111111 11111111 11111111 01111111
    
    这个二进制数作为补码,对应的十进制是**-129**(补码转原码:取反加1后得到10000000 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 17:04:57