побитовая арифметика со знаком в Python - PullRequest
0 голосов
/ 28 октября 2010

Я застрял со следующим кодом Python

>>> a = 0xff
>>> b = 1 << 8
>>> ~a & ~b
-512

Почему это -512? В двоичной записи это должно выглядеть так:

     a   0 1111 1111   -> 255
     b  01 0000 0000   -> 256

    ~a   1 0000 0000   -> -256
    ~b  10 1111 1111   -> -257

  ~a&~b 00 0000 0000   -> 0

Я ожидал 0 как со знаком int в C:

signed int a = 0xff;
signed int b = 1 << 8;  
signed int k = ~a & ~b;

Любая помощь?

1 Ответ

4 голосов
/ 28 октября 2010

Предполагая 16-битные целые для удобства (принцип не меняется для 32 или 64-битных):

a  = 0xff = 0000 0000 1111 1111
~a = -256 = 1111 1111 0000 0000

b  = 1<<8 = 0000 0001 0000 0000
~b = -257 = 1111 1110 1111 1111

-256 = 1111 1111 0000 0000
-257 = 1111 1110 1111 1111
--------------------------  &
-512 = 1111 1110 0000 0000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...