考虑以下代码:
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。这些通常可以最好地显示为真值表。输入的可能性在顶部和左侧,结果位是输入交叉处显示的四个值之一(如果不是,则为两个,因为它只有一个输入)。
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
和or
):
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句