按位运算符是处理多位值的运算符,但在概念上一次一个位。
> AND仅在其两个输入均为1时为1,否则为0。
>如果其中一个或两个输入为1,则OR为1,否则为0。
>只有当其中一个输入为1时,XOR为1,否则为0。
> NOT只有在其输入为0时为1,否则为0。
这些通常可以最好地显示为真值表。输入可能性在顶部和左侧,结果位是在输入的交叉处显示的四个值中的一个(在NOT的情况下为两个,因为它仅具有一个输入)值。
AND | 0 1 OR | 0 1 XOR | 0 1 NOT | 0 1
----+----- ---+---- ----+---- ----+----
0 | 0 0 0 | 0 1 0 | 0 1 | 1 0
1 | 0 1 1 | 1 1 1 | 1 0
一个例子是,如果你只想要一个整数的低4位,你和它15(二进制1111)所以:
201: 1100 1001
AND 15: 0000 1111
------------------
IS 9 0000 1001
在这种情况下,15中的零比特有效地充当滤波器,从而迫使结果中的比特也为零。
另外,>>和<
1001 0101 >> 2 gives 0010 0101
1111 1111 << 4 gives 1111 0000
注意Python中的左移是不寻常的,因为它不使用固定宽度的位被丢弃 – 而许多语言使用基于数据类型的固定宽度,Python只是扩展宽度以适应额外的位。为了得到在Python中的丢弃行为,你可以跟随左移位与逐位,例如在8位值向左移位四位:
bits8 = (bits8 << 4) & 255
考虑到这一点,位运算符的另一个例子是,如果你有两个4位的值要包装到一个8位的值,你可以使用所有三个运算符(左移,和或):
packed_val = ((val1 & 15) << 4) | (val2 & 15)
>& 15操作将确保两个值只有低4位。
><< 4是向左移4位以将val1移动到8位值的前4位中。
> |简单地将这两者结合在一起。
如果val1为7且val2为4:
val1 val2
==== ====
& 15 (and) xxxx-0111 xxxx-0100 & 15
<< 4 (left) 0111-0000 |
| |
+-------+-------+
|
| (or) 0111-0100