Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Bitwise operations in Python coming from C

I tried rewriting the small C program below in Python, but I am getting different outputs.

C version:

#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 version:

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))

And the outputs are:

C version

> $ ./test
data: 255 bit: 0 parity: 1

Python version

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

What am I missing on Python bitwise operations?

like image 646
kolrie Avatar asked Jan 01 '23 14:01

kolrie


1 Answers

As you can see, the only difference in the output is the value of the variable bit.

In your C program, the variable bit is declared as unsigned char. That means it takes on only the values 0 through 255. The last operation on bit in your code is

bit = bit << 1

Before the last time that line is executed, bit is 128. After that line, it "tries" to become 256 but that does not fit into an unsigned char. So overflow happens, not flagged by your program, and bit becomes 0.

In the Python program, the variable bit is simply an integer, int, which has no maximum size. So there is no overflow, and bit does become 256.

There are several ways to overcome that difference in Python. You could force bit to stay in the desired range by instead using

bit = (bit << 1) % 256

or perhaps

bit = (bit << 1) & 255

You could instead make bit to be the equivalent of an unsigned char variable. As a comment says, you could use the ctypes module, I believe. You could also use numpy (I'm more familiar with that).

like image 61
Rory Daulton Avatar answered Jan 05 '23 17:01

Rory Daulton