我在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已经内置了这种方法?我知道有一种方法可以做到这一点,但与其为此烦恼,我觉得值得一问是否内置了这样的功能。在
谢谢。在
如果只想保留一定数量的位,请使用掩码
and
这些位。在如果您发现位操作在移位和掩蔽方面很困难,您可能需要用熟悉的术语来概括它—例如,使用一个类似于位序列的类,并且可以进行切片等等
或者,更好的是,您可能希望得到一个能为您做到这一点的包装器,比如^{} 或{a2}。在
然后您可以编写如下代码:
…等等,在隐藏的情况下,它可能仍然在移动和屏蔽整数(尽管您关心的是,它可能是用C而不是Python),但是您不必用这些术语来思考。在
在我们谈话的时候,你没有提到任何关于endianness的事。如果您希望它是本机endian,或者显式的big-endian,或者类似的东西,那么当您手动执行shift和mask操作时,这是非常隐式的;最好将数字转换为字节字符串,然后将其转换为位字符串,使其显式。例如:
^{pr2}$最不麻烦的方法可能是使用显式的位掩码,例如
未经测试,换档量可能会减少一到两个。在
相关问题 更多 >
编程相关推荐