【问题标题】:Clearing the most significant bit清除最高有效位
【发布时间】:2021-01-22 22:10:00
【问题描述】:

我有一个包含两个字节的文件,按照 Big Endian 顺序,hexdump 给了我:

81 50

这是二进制的1000 0001 0101 0000。但是,我希望最高位是一个标志,所以在 golang 中我必须加载文件内容,清除最高位,然后才读取值。

所以:

valueBuf := make([]byte, 2)
_, err := f.Read(valueBuf) // now printing valueBuf gives me [129 80] in decimal
value := int16(binary.BigEndian.Uint16(valueBuf[0:2])) // now value is -32432

好的,我尝试过使用类似的东西:

func clearBit(n int16, pos uint) int16 {
    mask := ^(1 << pos)
    n &= mask
    return n
}

但它显然没有按预期工作。输出值应该是十进制的336,作为普通的int,我无法得到它。我该怎么做?

【问题讨论】:

  • 最低有效 15 位的格式是什么?它们可以是负数,还是未签名?
  • 是的,读给我听就像你可能想要uint16。我猜你可能会分离示例代码的步骤,但我也只是将encoding.Read 直接放入uint16,而不是单独读取和转换。

标签: go binary


【解决方案1】:

要使 n &amp;= mask 工作,nmask 必须是匹配类型。所以你应该写

mask := int16(^(1 << pos))

那么,value = clearBit(value, 15) 工作正常。

或者,由于常量是无类型的,你可以消除mask,也消除对n的赋值,因为它只是在下一行返回,并将clearBit缩短为

func clearBit(n int16, pos uint) int16 {
    return n & ^(1 << pos)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 2015-03-25
    相关资源
    最近更新 更多