2014-04-04 2 views
0

У меня есть 32-разрядное число, где я хочу установить последние 16 бит в ноль. В Python:bit-wise и vs смещение влево/вправо

#a is in base 10 
In [143]: a 
Out[143]: 536899058 

Обычно, я сделал бы побитовое И между номером и битовой маской.

# 11111111 11111111 00000000 00000000 is 4294901760 in base 10 
In [145]: a & 4294901760 
Out[145]: 536870912L 

В данном конкретном случае, есть ли какие-либо недостатки в переключение числа к правой 16 бит, а затем сдвига его обратно к влево на 16 позиций?

In [146]: (a >> 16) << 16 
Out[146]: 536870912 
+5

Я думаю, что 'a & 0xFFFF0000' более ясно – user3159253

+0

В обратном порядке. Во-первых, вы смещаетесь вправо, а затем уходите. У вас есть отрицательные числа? – Carsten

+0

Ops, извините. Нет, никаких отрицательных чисел. –

ответ

1

Помимо обфускации ваших намерений и принятия более одной инструкции, нет.

Если вы хотите быть на 100% уверенным, подайте запрос в SMT-решатель, который может понимать битвекторы и бинарные операторы, такие как Z3. Это докажет, являются ли утверждения равными (спойлер: они есть); Онлайн-ответ: here.

x = BitVec('x', 32) 

prove(x & 0xFFFF0000 == ((x >> 16) << 16)) 
Смежные вопросы