来自C的Python中的按位运算

时间:2018-11-23 01:14:04

标签: 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的按位运算中我缺少什么?

1 个答案:

答案 0 :(得分:9)

如您所见,输出的唯一区别是变量class Display extends React.Component { constructor(props){ super(props); this.props = { currentValue: this.props.currentValue } } render() { return( <h1>{this.props.currentValue}</h1> ); } } 的值。

在C程序中,变量bit被声明为bit。这意味着它仅采用值unsigned char0。您代码中255的最后一个操作是

bit

在最后一次执行该行之前,bit = bit << 1 bit。在该行之后,它会“尝试”成为128,但不适合256。这样就会发生溢出,而不是由程序标记出来,并且unsigned char变成bit

在Python程序中,变量0只是一个整数bit,没有最大大小。因此没有溢出,并且int确实变成了bit

有几种方法可以克服Python中的这种差异。您可以改为使用{p>来强制256保持在所需范围内

bit

或者也许

bit = (bit << 1) % 256

您可以改为使bit = (bit << 1) & 255 等于bit变量。正如评论所说,我相信您可以使用unsigned char模块。您也可以使用ctypes(我对此比较熟悉)。