英文:
golang: How to get first bit of byte
问题
我有一个哈希值:
b := hash.Sum(nil)
我只对该字节的第一个位感兴趣。它是0还是1?
到目前为止,我有这个代码:
s := strconv.FormatInt(int64(b[0]), 2)
if s[0] == '0' {
// 它是0
} else {
// 它是1
}
但我相信有一种更优雅(并且更高效?)的方法来实现这个。
英文:
I have a hash:
b := hash.Sum(nil)
I am really just interested in the first bit of that byte. Is it 0 or 1?
So far I have this:
s := strconv.FormatInt(int64(b[0]),2)
if s[0] == '0' {
// it's 0
} else {
// it's 1
}
But I am sure there is a much more elegant (and more performant?) way to do this.
答案1
得分: 6
你可以直接检查按位与运算符的结果:
if b[0] & 0x1 == 0x1 {
// 它是1
} else {
// 它是0
}
英文:
you could just check the result of bitwise and operator
if b[0] & 0x1 == 0x1 {
// it's 1
} else {
// it's 0
}
答案2
得分: 2
Sum()
函数返回一个字节切片。你想要隔离第一个字节的第一位,对吗?
这只是一个简单的位操作问题,最多需要2或3条机器指令。
根据你对"第一位"的理解,
以下代码可以获取一个字节的高位/最高有效位/最左边的位:
func HighOrderBit(b byte) byte {
return (b >> 7) & 0x01
}
以下代码可以获取一个字节的低位/最低有效位/最右边的位:
func LowOrderBit(b byte) byte {
return (b >> 0) & 0x01
}
需要注意的是,上述代码适用于任何整数类型:唯一的区别在于highOrderBit()
中右移的位数。右移的位数是整数类型的位数减一(例如,对于64位整数,右移的值是64-1,即63)。
英文:
The Sum()
function of a hash returns a slice of bytes. You want to isolate the first bit of the first byte, correct?
It's a simple matter of bit-twiddling. 2 or 3 machine instructions at most.
Depending on what you mean by "first bit",
This gives you the high-order/most significant/leftmost bit of a byte:
func HighOrderBit(b byte) byte {
return (b >> 7) & 0x01
}
And this gives you the low-order/least significant/rightmost bit of a byte:
func LowOrderBit(b byte) byte {
return (b >> 0) & 0x01
}
Note that the above works for any integer type: the only difference being the size of the right shift in highOrderBit()
. The number of bits to shift right is the size of the integer type in bits minus one (e.g., for a 64-bit integer, the shift value is 64-1, or 63).
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论