1

有什么方法可以让 Python 中的移位操作移出的位,比如 x86 程序集中的进位标志?

我搜索了python手册和互联网,但似乎找不到任何有用的东西。

我需要它来检查一个整数是奇数(CF=1)还是偶数(CF=0),并将其除以二合一命令。我知道我可以通过以下方式模仿预期的行为:

if x & 1==1: CF=1
else: CF=0

在我看来,这似乎是不必要的编码,或者我对 python 的期望很高。

4

2 回答 2

4

Python 中没有“移位并返回进位标志”操作——或者,实际上,几乎所有高级语言中都没有。即使在 C 语言中,y = x >> 1编译成与您手动编写的完全相同的机器语言操作,并且您知道进位标志具有您想要的东西,也无法访问它。

但是,您自己很容易做到这一点。而不是这个:

rest = x>>1
cf = get_carry_flag()

… 你来做这件事:

rest, cf = x>>1, x&1

它更紧凑——也可能更快。记住,这是 Python;x>>1不是转换为单个位移操作码,而是转换为解释器通过调用一个函数处理的字节码序列,该函数遵循指向表示任意长度整数的链表的指针并将其移位......</p>


对于另一种方式的移位,左移没有溢出,因此您必须专门关闭%最高位。一旦你这样做了,在丢弃它之前记住最高位并没有太多额外的负担。

于 2013-10-09T21:22:17.300 回答
0

左移:

x,bit= x<<1, (x&128)>>7

右移:

x,bit= x>>1, x&1

每次执行时,都会得到高位或低位,并且“x”移位

>>> x=0x5a
>>>
>>>
>>> x,bit= x<<1, (x&128)>>7; bit 0
>>> x,bit= x<<1, (x&128)>>7; bit 1
>>> x,bit= x<<1, (x&128)>>7; bit 0
>>> x,bit= x<<1, (x&128)>>7; bit 1
>>> x,bit= x<<1, (x&128)>>7; bit 1
>>> x,bit= x<<1, (x&128)>>7; bit 0
>>> x,bit= x<<1, (x&128)>>7; bit 1
>>> x,bit= x<<1, (x&128)>>7; bit 0
于 2021-09-27T13:42:18.720 回答