如何从一个字节中解压缩 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)
}
假设我有 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)
}