python - 来自 C 的 Python 中的按位运算

标签 python bitwise-operators

我尝试用 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。这意味着它仅采用 0255 的值。您代码中对 bit 的最后操作是

bit = bit << 1

在最后一次执行该行之前,bit128。在该行之后,它“尝试”变为 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/

相关文章:

java - Java 中按位运算的调试工具

Python:gettext 不会在 Windows 上加载翻译

python - 是否可以通过 python 引用来调用 C 函数?

python - 在XGB中使用F分数

python - PyQt5中使用cv2.imshow和drawpixmap的颜色图是不同的

python - Pandas :与组中第一个元素的差异

Java : Operators and Typecasting

c - 尾随零 - C

c++ - 将多个 bool 值放入一个无符号字符中?

c++ - 按位运算符和位操作(没有解决方案?)