我有一个散列:
b := hash.Sum(nil)
我真的只对字节的第一个比特感兴趣。是0还是1?
到目前为止,我有这个:
s := strconv.FormatInt(int64(b[0]),2)
if s[0] == '0' {
// it's 0
} else {
// it's 1
}
但是我确信有一种更优雅(和性能更好?)的方法来做到这一点。
你可以只检查位和运算符
的结果if b[0] & 0x1 == 0x1 {
// it's 1
} else {
// it's 0
}
哈希的Sum()
函数返回一个字节片。你想要隔离第一个字节的第一个位,对吗?
这是一个简单的小问题。最多2或3条机器指令。
根据你所说的"第一个位"的意思,
给你一个字节的高阶/最高有效位/最左位:
func HighOrderBit(b byte) byte {
return (b >> 7) & 0x01
}
这给了你一个字节的低阶/最低有效位/最右位:
func LowOrderBit(b byte) byte {
return (b >> 0) & 0x01
}
请注意,上述操作适用于任何整数类型:唯一的区别是highOrderBit()
中右移的大小。右移的位数是整型的大小减1(例如,对于64位整数,移位值为64-1,即63)。