我有一个32位无符号整数,我想将其分为3个uint16值。我想要前15位,然后2位,然后最后15位。
我正在尝试类似-
val >> 17
val >> 2
val >> 15
除了第一个值,其他2个都不对,我知道,但是现在能够弄清楚该如何解决?
Go play ground
最佳答案
例如,
package main
import "fmt"
func decode(bits uint32) (uint16, uint16, uint16) {
// first 15bits, then 2 bits and then last 15 bits.
const mask2 = ^uint32(0) >> (32 - 2)
const mask15 = ^uint32(0) >> (32 - 15)
b1 := uint16(bits >> (32 - 15))
b2 := uint16(bits >> (32 - 15 - 2) & mask2)
b3 := uint16(bits & mask15)
return b1, b2, b3
}
func main() {
b := uint32(4628440)
b1, b2, b3 := decode(b)
fmt.Printf("%032b %015b %02b %015b\n", b, b1, b2, b3)
fmt.Printf("%d %d-%d-%d\n", b, b1, b2, b3)
}
输出:
00000000010001101001111111011000 000000000100011 01 001111111011000
4628440 35-1-8152
关于go - 使用golang中的位移将位从32位无符号整数中取出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29566961/