golang: How to get first bit of byte

huangapple go评论111阅读模式
英文:

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).

huangapple
  • 本文由 发表于 2022年7月1日 22:23:16
  • 转载请务必保留本文链接:https://go.coder-hub.com/72830720.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定