<p>位运算符是处理多位值的运算符,但在概念上是一次一位。</p>
<ul>
<li><code>AND</code>只有当其输入的<em>和</em>都为1时才为1,否则为0。</li>
<li><code>OR</code>是1,如果输入的<em>一个或两个</em>都是1,否则是0。</li>
<li><code>XOR</code>只有当<em>它的输入中只有一个</em>是1时才是1,否则是0。</li>
<li><code>NOT</code>只有当其输入为0时才为1,否则为0。</li>
</ul>
<p>这些通常可以最好地显示为真值表。输入可能性在顶部和左侧,结果位是在输入交集处显示的四个值之一(如果不是,则为两个,因为它只有一个输入)。</p>
<pre><code>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
</code></pre>
<p>一个例子是,如果您只需要整数的低位4位,那么您和它用15(二进制1111)表示:</p>
<pre><code> 201: 1100 1001
AND 15: 0000 1111
------------------
IS 9 0000 1001
</code></pre>
<p>在这种情况下,15中的零位有效地充当一个过滤器,迫使结果中的位也为零。</p>
<p>此外,<code>>></code>和<code><<</code>通常包含为按位运算符,它们将一个值分别左右“移位”一定数量的位,丢弃向其移动的一端滚动的位,并在另一端输入零位。</p>
<p>例如:</p>
<pre><code>1001 0101 >> 2 gives 0010 0101
1111 1111 << 4 gives 1111 0000
</code></pre>
<p>请注意,Python中的左移不常见,因为它没有使用丢弃位的固定宽度,而许多语言根据数据类型使用固定宽度,Python只是扩展宽度以满足额外位的需要。为了获得Python中的丢弃行为,可以使用按位<code>and</code>执行左移位,例如在8位值中左移4位:</p>
<pre><code>bits8 = (bits8 << 4) & 255
</code></pre>
<p>考虑到这一点,按位运算符的另一个示例是,如果有两个4位值要打包为8位值,则可以使用这三个运算符(<code>left-shift</code>、<code>and</code>和<code>or</code>):</p>
<pre><code>packed_val = ((val1 & 15) << 4) | (val2 & 15)
</code></pre>
<ul>
<li><code>& 15</code>操作将确保两个值都只有较低的4位。</li>
<li><code><< 4</code>是左移4位,将<code>val1</code>移到8位值的前4位。</li>
<li><code>|</code>只是将这两者结合在一起。</li>
</ul>
<p>如果<code>val1</code>是7,<code>val2</code>是4:</p>
<pre><code> val1 val2
==== ====
& 15 (and) xxxx-0111 xxxx-0100 & 15
<< 4 (left) 0111-0000 |
| |
+-------+-------+
|
| (or) 0111-0100
</code></pre>