猿问

在 go lang 中使用 bitshift 从 32 位无符号整数中获取位

我有一个 32 位无符号整数,我想将它分成 3 个 uint16 值。我想要第一个 15 位,然后是 2 位,然后是最后 15 位。


我正在尝试类似的东西 -


val >> 17

val >> 2

val >> 15

除了第一个值,其他 2 个都不正确,我知道这一点,但现在能够弄清楚如何解决这个问题?


Cats萌萌
浏览 303回答 2
2回答

海绵宝宝撒

例如,package mainimport "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 0011111110110004628440 35-1-8152

胡说叔叔

提取一系列位的辅助函数使这易于理解(和测试)。package mainimport "fmt"// extractUint16 extracts n bits of a from the given offset.func extractUint16(a uint32, offset, n uint) uint16 {&nbsp; &nbsp; return uint16((a >> offset) & (1<<n - 1))}func main() {&nbsp; &nbsp; input := uint32(4628440)&nbsp; &nbsp; a := extractUint16(input, 17, 15)&nbsp; &nbsp; b := extractUint16(input, 15, 2)&nbsp; &nbsp; c := extractUint16(input, 0, 15)&nbsp; &nbsp; fmt.Println(a, b, c)}
随时随地看视频慕课网APP

相关分类

Go
我要回答