2013-10-09 3 views
1

Есть ли способ получить бит, сдвинутый с помощью операции переключения в Python, например флаг переноса в сборке x86?Переместить бит битового сдвига python

Я искал руководство для python и интернет, но, похоже, не нашел ничего полезного.

Мне нужно его проверить, является ли целое число нечетным (CF = 1) или даже (CF = 0) и делить его на две в одной команде. Я знаю, что я могу имитировать намеченную поведение:

if x & 1==1: CF=1 
else: CF=0 

Это кажется мне, как ненужное кодирование, или я ожидал многого от питона.

+5

И что случилось с 'CF = x & 1'? – arshajii

+0

Ох ..., не думал об этом. Woops. Тем не менее кажется, что он должен идти с инструкцией сдвига автоматически. Я так привык к этому сейчас из своего программирования в сборке, что я не могу не думать, что он уже должен быть где-то в статусном флаге. – Erik

+2

Вы не часто работаете с битовыми полями на Python, но, когда вы это делаете, это не так неожиданно, чтобы увидеть код типа 'rest, cf = x >> 1, x & 1'. – abarnert

ответ

4

В Python отсутствует операция «shift and also return carry flag» - или, действительно, практически на любом языке более высокого уровня. Даже в C, где y = x >> 1 компилируется на тот же машинный язык, который вы бы написали вручную, и знаете, что флаг переноса имеет то, что вы хотите, нет никакого способа получить к нему доступ.

Однако это очень легко сделать сами. Вместо этого:

rest = x>>1 
cf = get_carry_flag() 

... вы это делаете:

rest, cf = x>>1, x&1 

Это более компактный и, вероятно, быстрее, тоже. Помните, что это Python; x>>1 не переводит в один бит сдвига опкодом, но в последовательность байт-кодов, что интерпретатор обрабатывает, вызывая функцию, которая следует указатель на связанный список, представляющий собой произвольную длину целое и сдвигает, что ...


Для перемещения в другую сторону, там - нет переполнения влево-вправо, поэтому вам нужно только с % с верхнего разряда. Как только вы это сделаете, помните, что верхний бит перед отбрасыванием не является большим бременем.

Смежные вопросы