考虑这个代码:

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-shiftand 和 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/

    10-12 20:03
    查看更多