代码之家  ›  专栏  ›  技术社区  ›  kolrie

python中的位操作来自C

  •  4
  • kolrie  · 技术社区  · 6 年前

    我试着用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
    

    蟒蛇版本

    > $ python3 test.py
    data: 255 bit: 256 parity: 1
    

    在python按位操作中缺少什么?

    1 回复  |  直到 6 年前
        1
  •  9
  •   Rory Daulton    6 年前

    如您所见,输出的唯一区别是变量的值 bit .

    在C程序中,变量 一点 被宣布为 unsigned char . 这意味着它只接受价值观 0 通过 255 . 上一次操作 一点 在您的代码中

    bit = bit << 1
    

    在上次执行该行之前, 一点 128 . 在那句话之后,它“尝试”成为 256 但这不符合 无符号字符 . 所以会发生溢出,而不是被程序标记,并且 一点 变成 .

    在python程序中,变量 一点 只是一个整数, int ,没有最大大小。所以没有溢出,并且 一点 确实成为 二百五十六 .

    有几种方法可以克服Python中的差异。你可以强迫 一点 通过使用

    bit = (bit << 1) % 256
    

    或者也许

    bit = (bit << 1) & 255
    

    你可以改为 一点 相当于 无符号字符 变量。正如评论所说,您可以使用 ctypes 模块,我相信。你也可以用 numpy (我更熟悉这一点)。