整数和二进制的符号与检查
Sign of integer and binary AND check
如果我在 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)
}
}
这将打印出 "constant 128 overflows 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.1linux/amd64
为了表示负整数,Go(我相信 C++ 也像大多数语言一样)使用 2's complement 格式和标准。
在 2 的补码中,如果数字为负数,最高位 (MSB) 将为 1
,否则为 0
。
在 Go 中,您不能使用类型为 int8
的 0x80
类型常量,因为它超出了其有效范围。
但是您可以将 int8
转换为 uint8
"losslessly",然后您就可以这样做了。
此外,当您屏蔽 0x80
位时,您必须将结果与 0x80
进行比较,因为 x & 0x80
永远不会导致 1
,仅在 0
或 0x80
.
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
如果我在 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)
}
}
这将打印出 "constant 128 overflows 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.1linux/amd64
为了表示负整数,Go(我相信 C++ 也像大多数语言一样)使用 2's complement 格式和标准。
在 2 的补码中,如果数字为负数,最高位 (MSB) 将为 1
,否则为 0
。
在 Go 中,您不能使用类型为 int8
的 0x80
类型常量,因为它超出了其有效范围。
但是您可以将 int8
转换为 uint8
"losslessly",然后您就可以这样做了。
此外,当您屏蔽 0x80
位时,您必须将结果与 0x80
进行比较,因为 x & 0x80
永远不会导致 1
,仅在 0
或 0x80
.
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