考虑这个代码:
x = 1 # 0001
x << 2 # Shift left 2 bits: 0100
# Result: 4
x | 2 # Bitwise OR: 0011
# Result: 3
x & 1 # Bitwise AND: 0001
# Result: 1
我可以理解 Python(和其他语言)中的算术运算符,但我从来没有很好地理解“按位”运算符。在上面的示例中(来自 Python 书籍),我理解左移但不理解其他两个。
另外,按位运算符实际用于什么?我很感激一些例子。
最佳答案
按位运算符是处理多位值的运算符,但在概念上一次一位。
AND
仅当其两个输入均为 1 时才为 1,否则为 0。 OR
如果其中一个或两个输入为 1,则为 1,否则为 0。 XOR
仅当其输入之一为 1 时才为 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 中获得丢弃行为,您可以使用按位
and
进行左移,例如将 8 位值左移四位:bits8 = (bits8 << 4) & 255
考虑到这一点,按位运算符的另一个示例是,如果您想将两个 4 位值打包成一个 8 位值,则可以使用所有三个运算符(
left-shift
、 and
和 0x251812231343 ):packed_val = ((val1 & 15) << 4) | (val2 & 15)
or
操作将确保两个值都只有低 4 位。 & 15
左移 4 位,将 << 4
移动到 8 位值的前 4 位。 val1
只是将这两者结合在一起。 如果
|
是 7 并且 val1
是 4: val1 val2
==== ====
& 15 (and) xxxx-0111 xxxx-0100 & 15
<< 4 (left) 0111-0000 |
| |
+-------+-------+
|
| (or) 0111-0100
关于python - 按位运算和使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1746613/