为了账号安全,请及时绑定邮箱和手机立即绑定

从 32 位中获取一位的值

从 32 位中获取一位的值

Go
当年话下 2022-05-10 13:37:01
右移后如何应用蒙版以仅获得一位?这取决于您向右移动了多少位置?在 32 位结构中,我试图获取第 9 位和第 10 位的值。x := uint32(11537664)0000 0000 1011 0000 0000 1101 0000 0000          ^^那么对于第 9 位,如果我右移 23 位,我需要屏蔽一个字节吗?这似乎隔离了第 9 位,因为我得到的值为 1。(x >> 23) & 0xff9th bit...should be 1... looks ok.000000000000000000000000000000010x1  因此,为了获得应该为 0 的第 10 位,我将少移一位,这确实使 0 一直向右移动。但是后面有一个 1 需要被屏蔽。我为掩码计算了 1 个字节加 1 个位,但我仍然看到位置 2 中的位,所以这是不对的。(x >> 22) & 0x1ff10th bit... should be 0, but this shift and mask does not look correct.00000000000000000000000000000010                              ^  This bit I don't want. 0x2示例链接:https: //play.golang.org/p/zqofCAAKDZzpackage mainimport (    "fmt")func bin(i uint32) {    fmt.Printf("%032b\n", i)}func hex(i uint32) {    fmt.Printf("0x%x\n", i)}func show(i uint32) {    bin(i)    hex(i)    fmt.Println()}func main() {    x := uint32(11537664)    fmt.Println("Data")    show(x)    fmt.Println("First 8 bits.")    show(x >> 24)    fmt.Println("9th bit...should be 1")    show((x >> 23) & 0xff)    fmt.Println("10th bit... should be 0")    show((x >> 22) & 0x1ff)}
查看完整描述

1 回答

?
交互式爱情

TA贡献1712条经验 获得超3个赞

移位后,您会得到一个数字0b10,并且您只需要最低位。那你为什么要掩饰0x1ff呢?它有 9 个一位,这将使最低 9 位保持不变(未屏蔽)。


而是用0b01 = 0x01. 这只留下最低位,并将所有其他位归零:


show((x >> 22) & 0x01)

在Go Playground上尝试一下。


另请注意,如果您只想测试某个位是 1 还是 0,则不必移动。通过在特定位置包含单个位掩码的适当位掩码进行掩码就足够了。您可以将屏蔽结果与零进行比较。


测试第nth位的正确位掩码很简单1<<n(其中位为零索引)。您要测试的 2 位是 22. 和 23. 位。


看这个例子:


x := uint32(11537664)

fmt.Printf("x      : %032b\n", x)


fmt.Println()

const mask22 = 1 << 22

fmt.Printf("mask22 : %032b\n", mask22)

fmt.Printf("22. bit: %032b %t\n", x&mask22, x&mask22 != 0)


fmt.Println()

const mask23 = 1 << 23

fmt.Printf("mask23 : %032b\n", mask23)

fmt.Printf("23. bit: %032b %t\n", x&mask23, x&mask23 != 0)

它输出(在Go Playground上尝试):


x      : 00000000101100000000110100000000


mask22 : 00000000010000000000000000000000

22. bit: 00000000000000000000000000000000 false


mask23 : 00000000100000000000000000000000

23. bit: 00000000100000000000000000000000 true


查看完整回答
反对 回复 2022-05-10
  • 1 回答
  • 0 关注
  • 114 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信