我尝试用 Python 重写下面的小 C 程序,但我得到了不同的输出。
C 版:
#include <stdio.h>
int main()
{
unsigned char data = 0x00;
unsigned char i;
unsigned char bit = 0x01;
unsigned char parity = 1;
unsigned char value = 0x1c;
for (i = 0; i < 8; i++)
{
data = data | bit;
bit = bit << 1;
parity = parity ^ (data & 0x01);
}
printf("data: %d bit: %d parity: %d\n", data, bit, parity);
return 0;
}
Python 版本:
data = 0
bit = 1
parity = 1
value = int('1c', 16)
for i in range(8):
data = data | bit
bit = bit << 1
parity = parity ^ (data & 1)
print('data: {0} bit: {1} parity: {2}'.format(data, bit, parity))
输出是:
C 版
> $ ./test
data: 255 bit: 0 parity: 1
Python 版本
> $ python3 test.py
data: 255 bit: 256 parity: 1
我在 Python 按位运算中遗漏了什么?
最佳答案
如您所见,输出中的唯一区别是变量 bit
的值。
在您的 C 程序中,变量 bit
被声明为 unsigned char
。这意味着它仅采用 0
到 255
的值。您代码中对 bit
的最后操作是
bit = bit << 1
在最后一次执行该行之前,bit
为 128
。在该行之后,它“尝试”变为 256
,但这不适合 unsigned char
。所以溢出发生了,没有被你的程序标记,并且 bit
变成了 0
。
在 Python 程序中,变量 bit
只是一个整数,int
,没有最大大小。所以没有溢出,bit
确实变成了256
。
有几种方法可以克服 Python 中的这种差异。您可以通过使用
来强制bit
保持在所需的范围内
bit = (bit << 1) % 256
或许
bit = (bit << 1) & 255
您可以改为使 bit
等同于 unsigned char
变量。正如评论所说,我相信您可以使用 ctypes
模块。您也可以使用 numpy
(我对此比较熟悉)。
关于python - 来自 C 的 Python 中的按位运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53439614/