Python 按位和vs左/右移位

Python 按位和vs左/右移位,python,bit-manipulation,bitwise-operators,bit-shift,Python,Bit Manipulation,Bitwise Operators,Bit Shift,我有一个32位的数字,我想把最后16位设为零。在Python中: #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位,然后再将数字向左移动1

我有一个32位的数字,我想把最后16位设为零。在Python中:

#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

[146]中的
:(a>>16)除了混淆你的意图和接受多条指令之外,没有

如果你想100%确定,把你的查询输入一个SMT解算器,它可以理解位向量和二进制运算符,比如Z3。这将证明这些陈述是否相等(扰流板:它们是相等的);在线回复是

x=BitVec('x',32)

证明(x&0xFFFF0000==((x>>16)我认为
a&0xFFFF0000
反过来更清晰。首先,你的移动是先向右然后向左。你有负数吗?对不起,没有,没有负数。如果你要使用移位技术,最好将其拆分为多个语句以确保可读性。先向右然后向左移位,与shi不同先向左然后向右。这里的意思不清楚。好的,我加了括号
x = BitVec('x', 32)

prove(x & 0xFFFF0000 == ((x >> 16) << 16))