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!
谁能解释一下!!
预先感谢。
这将输出您期望的结果(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
带符号,表示负数的最常见方法是补码)。