【问题标题】:Can I set a particular number of bits to keep for Python's logical shift left?我可以为 Python 的逻辑左移设置特定数量的位吗?
【发布时间】:2013-12-12 22:28:53
【问题描述】:

我在 THUMB(ARM 的指令集)中使用了一些 lsl 和 lsr,它们的工作方式与寄存器中的位数有关。

在我的特殊情况下,它恰好是 16 位寄存器,但这并不过分重要,出于示例的目的,我将假设它们只有 4 位。

基本上,他们的行为是这样的:

mov r0, #0x1011
lsl r0, #0x1

mov 会将 r0 设置为 1000,然后 lsl 会将它们移位,但是因为 r0 内的数字已经是 4 位,而且,正如我之前所说,我们假装我们正在使用 4 位寄存器,那个位是丢失,r0 会变成#0x0110。

基本上发生的情况是,将某物 lsl n 位,丢失 n 个最高有效位,其余值按预期移动,并添加 0 以填充最低有效位。

这可能有一个名字,对不起,我不知道它是什么,但希望我所指的足够清楚。

我正在使用 Python 中的

有没有一种简单的方法来处理这个已经内置在 Python 中的问题?我知道一种方法,但与其为此烦恼,我认为值得询问是否内置了这样的功能。

谢谢。

【问题讨论】:

    标签: python bit-manipulation bit shift


    【解决方案1】:

    最不麻烦的方法可能是使用显式位掩码,例如

    a = (sixteen_bit_val & 0xE000) >> 13
    b = (sixteen_bit_val & 0x1800) >> 11
    # ... and so on ..
    

    未经测试,班次数量可能相差一两个。

    【讨论】:

    • @MarkRansom 是的,是的。 OP 说他想“将一个 16 位数字拆分为……”您将一个数字拆分为具有右移的位域,而不是左移。我只能假设前面提到的汇编语言代码使用了左移然后右移而不是屏蔽。
    • @Zack - 是的。例如,为了获得第四和第五位,我们的想法是使用 lsl 去除最高有效位,并使用 lsr。
    • 你是对的,问题描述与预期的最终结果不匹配。所以你的答案最终可能会比我的更有用。不过,如果由我决定,我会在轮班之后而不是之前进行掩蔽。
    • @MarkRansom 我发现如果我先做掩码,则更容易考虑适当的掩码和移位值。 YMMV。
    【解决方案2】:

    如果您发现移位和掩码方面的位操作很困难,您可能希望用熟悉的术语将其包装起来——例如,使用类似于位序列并且可以被切片的类等。

    或者,更好的是,您可能希望获得一个为您执行此操作的包装器,例如 bitarraybitstring

    然后你可以这样写代码:

    >>> bin[13:16]
    bitarray('010')
    >>> bin[11:13]
    bitarray('11')
    

    ... 等等。在幕后,它可能仍在移动和屏蔽整数(尽管您可能关心它可能是在 C 中而不是 Python 中),但您不必考虑这些术语。

    在我们讨论的时候,你没有提到任何关于字节序的事情。如果您希望它是本地字节序,或显式大字节序,或类似的东西,当您进行手动移位和掩码操作时,这是非常隐含的;最好通过将数字转换为字节字符串,然后将其转换为位字符串来使其明确。例如:

    n = int(input())
    b = struct.pack('!H', n) # explicitly network-endian
    bb = bitarray(16) # explicitly 16 bits
    bb.frombytes(b)
    bb[13:16]
    

    【讨论】:

      【解决方案3】:

      如果您只想保留一定数量的位,请使用and 这些位的掩码。

      >>> bin((0b1011 << 1) & 0b1111)
      '0b110'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-11
        • 2020-07-22
        相关资源
        最近更新 更多