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

南瓜种子 :

如果我用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

icza:

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

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

在Go中,您不能使用具有0x80类型常量类型常量int8,因为它超出了有效范围。

但是,您可以转换int8uint8“无损”,然后可以这样做。

另外,在屏蔽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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

系统二进制文件的校验和已更改

添加到无符号和有符号二进制整数

处理二进制数据和无符号字符

爪哇 - 整数和二进制文件

符号链接会发生什么?原始二进制文件和符号二进制文件的行为不同

Servlet读取/输出二进制文件或与原始文件相同的校验和

递归二进制搜索整数

读取整数的二进制文件

负整数到有符号32位二进制数

转换三个字节,二进制补码,有符号整数

从二进制文件读取无符号整数64位

将二进制文件读入全局无符号整数

Go中无符号整数的二进制表示

在Python中将二进制表示形式转换为带符号的64位整数

使用ifstream从C ++文件中读取二进制无符号短整数

不能正确地将大的无符号整数写入二进制文件-C ++

Python读取无符号16位整数的二进制文件

使用位掩码将有符号整数转换为二进制补码

如何使用Numpy创建给定无符号整数的二进制数字数组?

将原始的14位二进制补码转换为带符号的16位整数

从二进制快速字符串中获取有符号整数

将二进制编码的无符号字符转换为整数

将整数转换为带符号的2的补码二进制字符串

在 Python 中将二进制转换为有符号的小端 16 位整数

有符号和无符号二进制有什么区别

“使用带符号的整数操作数和二进制按位运算符”-使用无符号的short时

Elixir二进制模式的整数匹配或将整数转换为二进制

Python将整数与十六进制和二进制数进行比较

需要十六进制到二进制字符串和整数和谐