【问题标题】:pulling arbitrary bit length integer out of an integer bit field in python从python中的整数位字段中提取任意位长整数
【发布时间】:2020-12-01 19:49:58
【问题描述】:

我有一个来自硬件设备的整数,其中嵌入了多个值作为任意长度的位字段。

例如,我有一个“状态”值,它是一个 16 位整数,其中包含多个值。一个是从第三位开始的 4 位整数。

我正在使用我编写的函数提取它:

def vnGetFieldFromStatus(status):
    return ((status & 0b0001111000000000)>> 9)

我相信这一切正常。

是否有一种通用的 Python 方法来获取从字节 j 开始的 i 字节组成的 int?

【问题讨论】:

  • 字节还是位?您的标题和问题的第一部分谈论的是位,但最后一句谈论的是字节。
  • 你知道如何从 i=4 和 j=9 构造数字 0b1111000000000 吗?
  • 这能回答你的问题吗? Algorithm to generate bit mask
  • mkrieger 感谢您提出的有用问题。我想我会取 2 的 i 次方,减去 1,然后将其左移 9 位。所以这应该让我创建面具。我会玩一下,也会检查你留下的链接。

标签: python bit-manipulation


【解决方案1】:

我制定了几个函数来帮助我:


# pulls an arbitrary number of bits out of a 16 bit field and returns an int with the values
def extractIntFrom16BitField(bitfield, startbit, nbits):
    if startbit<0:
        startbit=15+startbit
    if (startbit+nbits)>16:
        return 0
    rightPad=16-(startbit+nbits)
    if rightPad<0:
        return 0
    mask = ((pow(2,nbits)-1)<<rightPad)
    return((bitfield & mask) >> rightPad)

# Returns a list of ints, each extracted according to the input list of field lengths
# e.g. extractAllFieldsFrom16BitField(0b1010101000001100,[2,1,4,1,8])
#   returns [2,1,5,0,12]
def extractAllFieldsFrom16BitField(bitfield, listOfLengths):
    startpos=0
    returnVal=[]
    for l in listOfLengths:
        returnVal.append(extractIntFrom16BitField(bitfield, startpos, l))
        startpos=startpos+l
    return returnVal

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    • 2021-01-02
    • 2011-10-29
    • 1970-01-01
    • 2020-02-22
    相关资源
    最近更新 更多