我可以为Python设置要保留的特定位数吗';什么是逻辑左移?

我可以为Python设置要保留的特定位数吗';什么是逻辑左移?,python,bit-manipulation,bit,shift,Python,Bit Manipulation,Bit,Shift,我在THUMB中使用了lsl和lsr(ARM的指令集),它们的工作方式与寄存器中的位数有关 在我的特殊情况下,它恰好是16位寄存器,但这并不太重要,出于示例的目的,我将假设它们只有4位 基本上,他们的行为是这样的: mov r0, #0x1011 lsl r0, #0x1 mov会将r0设置为1000,然后lsl会将其移位,但因为r0中的数字已经是4位,正如我前面所说的,我们假装正在使用4位寄存器,该位丢失,r0将变成#0x0110 基本上发生的是,通过n位lsl某物,n个最高有效位丢失,其余

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

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

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

mov r0, #0x1011
lsl r0, #0x1
mov会将r0设置为1000,然后lsl会将其移位,但因为r0中的数字已经是4位,正如我前面所说的,我们假装正在使用4位寄存器,该位丢失,r0将变成#0x0110

基本上发生的是,通过n位lsl某物,n个最高有效位丢失,其余值按预期移位,0被添加以填充最低有效位

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


我正在使用实现这一点最简单的方法可能是使用显式位掩码,例如

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

未测试,移位量可能会关闭一到两个。

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

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

>>bin((0b1011如果您发现移位和掩蔽方面的位操作很困难,您可能希望用熟悉的术语来概括它,例如,使用一个类似于位序列的类,并且可以切片,等等

或者,更好的是,你可能想得到一个包装,为你这样做,像或

然后您可以编写如下代码:

>>> bin[13:16]
bitarray('010')
>>> bin[11:13]
bitarray('11')
…等等。在封面下,它可能仍然在移位和掩蔽整数(尽管您关心的是它可能是C语言而不是Python语言),但您不必用这些术语来思考

在我们讨论时,您没有提到任何关于endian的内容。如果您希望它是本机endian,或者显式的big endian,或者类似的内容,当您执行手动移位和掩码操作时,这是非常隐式的;最好将数字转换为字节字符串,然后将其转换为位字符串,从而使其显式。例如:

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

@Markransem是的,是的。OP说他想“把一个16位的数字分成您使用shift right(右移位)而不是shift left(左移位)将数字拆分为位域。我只能假设前面提到的汇编语言代码使用了左移位,然后再向右移位,而不是掩蔽。@Zack-是的。为了获得例如第四位和第五位,我们的想法是使用lsl来去除最重要的位,然后使用lsr(lsr)。您需要如果你是对的,问题描述与期望的最终结果不匹配。因此,你的答案最终可能比我的更有用。不过,如果由我决定,我会在移位后而不是之前进行掩蔽。@markransem如果我先进行掩蔽,我会更容易考虑合适的掩蔽和移位值。YMMV。