Golang 对按位非运算产生奇怪的结果

问题描述 投票:0回答:1
package main

import "fmt"

func SingleZeroBitAtRightMostOneBitPosition(n int) int {
    return ^n | (n - 1)
}

func main() {
    fmt.Println(SingleZeroBitAtRightMostOneBitPosition(128))
    // -129 is producing instead of 127!!

}

128 -> 10000000
^128 -> 01111111
127 -> 01111111
结果应为 127 (01111111) 但 golang 产生-129! 谁能解释一下!! 预先感谢。

go bit-manipulation bitwise-operators
1个回答
0
投票

这将输出您期望的结果(127):

func SingleZeroBitAtRightMostOneBitPosition(n uint8) uint8 {
    return ^n | (n - 1)
}

请注意,我使用的是无符号 8 位整数;

int8
不起作用,因为,正如规范中提到的
int8
是“所有有符号 8 位整数(-128 到 127)的集合”(不包括 128)。

根据评论,这里的主要问题是

int
将是 32 位或 64 位;让我们用 32 位 int 完成操作(最终结果与 64 位相同):

128  00000000 00000000 00000000 10000000

^128 11111111 11111111 11111111 01111111
127  00000000 00000000 00000000 01111111
OR   11111111 11111111 11111111 01111111

所以结果是 -129(

int
带符号,表示负数的最常见方法是补码)。

© www.soinside.com 2019 - 2024. All rights reserved.