Как я указывал в своем вчерашнем ответе на ответ CMS, сдвиг влево отрицательного числа является неопределенным поведением в C, так что это даже не гарантированно работает в C (проблема в том, как обрабатывать бит со знаком, Вы сдвигаете его как бит значения или это не влияет на сдвиг? Комитет по стандартам не может договориться о поведении, поэтому он остался неопределенным).
Когда это работает в C, оно опирается на фиксированные целочисленные значения битовой ширины, так что крайний левый бит сбрасывается с конца, когда вы выполняете сдвиг (для этого также требуется, чтобы знаковый бит обрабатывался как бит значения ). Все целочисленные типы в C являются фиксированными битами, но числа Python могут быть произвольно большими. Сдвиг влево числа в Python просто заставляет его увеличиваться:
>>> 1 << 100
1267650600228229401496703205376L
Вы можете попробовать что-то вроде этого:
x = (a << 1) & 0xffffffff
Чтобы ограничить результат 32-битным, проблема в том, что левый оператор сдвига в Python не сдвигает знаковый бит числа со знаком (что является частью того, что требуется для работы этого конкретного решения). Возможно, есть способ изменить поведение оператора сдвига, но я не знаю, как.