使用golang中的位移来从32位无符号整数中获取位

时间:2015-04-10 17:04:35

标签: go

我有一个32位无符号整数,我想用3 uint16值除以它。我想要前15位,然后是2位,然后是15位。

我正在尝试像 -

val >> 17
val >> 2
val >> 15

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

Go play ground

2 个答案:

答案 0 :(得分:3)

例如,

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

答案 1 :(得分:1)

提取一系列位的辅助函数使这很容易理解(和测试)。

package main

import "fmt"

// extractUint16 extracts n bits of a from the given offset.
func extractUint16(a uint32, offset, n uint) uint16 {
    return uint16((a >> offset) & (1<<n - 1))
}

func main() {
    input := uint32(4628440)
    a := extractUint16(input, 17, 15)
    b := extractUint16(input, 15, 2)
    c := extractUint16(input, 0, 15)
    fmt.Println(a, b, c)
}