我有一个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/

10-13 08:39