我可以为Python的逻辑左移设置一个特定的位数吗?

2024-05-23 19:31:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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中的<;<;运算符,我需要这样做。实际上,我需要把一个16位数字分成最高有效的3位,下一个最高有效的2位,等等

有没有一种简单的方法可以处理这个问题,而Python已经内置了这种方法?我知道有一种方法可以做到这一点,但与其为此烦恼,我觉得值得一问是否内置了这样的功能。在

谢谢。在


Tags: 方法lt方式情况数字寄存器内置arm
3条回答

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

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

如果您发现位操作在移位和掩蔽方面很困难,您可能需要用熟悉的术语来概括它—例如,使用一个类似于位序列的类,并且可以进行切片等等

或者,更好的是,您可能希望得到一个能为您做到这一点的包装器,比如^{}或{a2}。在

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

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

…等等,在隐藏的情况下,它可能仍然在移动和屏蔽整数(尽管您关心的是,它可能是用C而不是Python),但是您不必用这些术语来思考。在

在我们谈话的时候,你没有提到任何关于endianness的事。如果您希望它是本机endian,或者显式的big-endian,或者类似的东西,那么当您手动执行shift和mask操作时,这是非常隐式的;最好将数字转换为字节字符串,然后将其转换为位字符串,使其显式。例如:

^{pr2}$

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

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

未经测试,换档量可能会减少一到两个。在

相关问题 更多 >