如何从一个字节中解压缩 2、2 和 3 位

How to unpack 2, 2 and 3 bits out of a byte

假设我有 3 个字节(2x2 位和 1x3 位)打包如下:

func pack(a, b, c byte) byte { // is there a more efficient way to pack them?
    return a<<6 | b<<4 | c
}

func main() {
    v := pack(1, 2, 6)
    a := v >> 6
    b := v >> 4 // wrong
    c := v & 7
    fmt.Println(v, a, b, c)
}

如何解压缩 b

您需要屏蔽掉未使用的位,就像您已经为 c 所做的那样。我还在 pack 函数中添加了掩码,以防止值意外重叠:

const (
    threeBits = 0x7
    twoBits   = 0x3
)

func pack(a, b, c byte) byte {
    return a<<6 | b&twoBits<<4 | c&threeBits
}

func main() {
    v := pack(1, 2, 6)
    a := v >> 6
    b := v >> 4 & twoBits
    c := v & threeBits
    fmt.Println(v, a, b, c)
}