我尝试用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的按位运算中我缺少什么?
答案 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 char
至0
。您代码中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
(我对此比较熟悉)。