按位与与左/右位移
我有一个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
1 个回答
1
除了让你的意图变得模糊和需要多条指令之外,没什么其他的了。
如果你想要百分之百确定,可以把你的查询输入到一个能理解位向量和二进制运算符的SMT求解器,比如Z3。它会证明这些语句是否相等(剧透:它们是相等的);你可以在这里找到一个在线的工具。
x = BitVec('x', 32)
prove(x & 0xFFFF0000 == ((x >> 16) << 16))