gpt4 book ai didi

go - 整数和二进制的符号AND校验

转载 作者:行者123 更新时间:2023-12-01 20:26:48 25 4
gpt4 key购买 nike

如果我用C++正确,则LSB是最后一位,并确定整数的符号。因此,例如在8位的情况下,1111 1111将为-127,而1111 1110将为127。如果我错了,请更正我,但与我无关。

我会检查Go中整数的符号,所以我写了以下内容:

func signCheck(n int8) {
var sign int8 = 1<<7

if n&sign == 1 {
fmt.Printf("%d is odd - %b\n", n, n)
} else {
fmt.Printf("%d is even - %b\n", n, n)
}
}

这将打印出“常数128溢出int8”,但这是有道理的,因为因为只有7位用于确定数字。所以我修改如下:
func signCheck(n int8) {
if n&1<<7 == 1 {
fmt.Printf("%d is odd - %b\n", n, n)
} else {
fmt.Printf("%d is even - %b\n", n, n)
}
}

在这种情况下,我不必说它是int8,但我用-127和127进行了测试,并得到以下打印结果:
-127 is even - -1111111
127 is even - 1111111

那么在那种情况下我应该如何检查标志?
go版本go1.13.1 linux/amd64

最佳答案

为了表示负整数,Go(而且我相信C++也像大多数语言一样)使用2's complement格式和标准。

如果数字为负,则2的补码中最高位(MSB)将为1,否则为0

在Go中,您不能使用类型为0x80int8类型常量,因为该常量不在其有效范围内。

但是,您可以“无损”将int8转换为uint8,然后可以这样做。

另外,在屏蔽0x80位时,必须将结果与0x80进行比较,因为x & 0x80永远不会导致1,而只会导致00x80

func signCheck(n int8) {
if uint8(n)&0x80 == 0x80 {
fmt.Printf("%d is negative - %b\n", n, n)
} else {
fmt.Printf("%d is non-negative - %b\n", n, n)
}
}

另一个选择是将屏蔽结果与 0进行比较:
if uint8(n)&0x80 != 0 { }

两种解决方案都给出输出(在 Go Playground上尝试):
-127 is negative - -1111111
127 is non-negative - 1111111

关于go - 整数和二进制的符号AND校验,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60721132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com