Побитовые операторы - это операторы, которые работают с несколькими битовыми значениями, но концептуально по одному бит за раз.
AND
равно 1, только если как входы 1, в противном случае - 0. OR
равно 1, если один или оба его входов равны 1, в противном случае это 0. XOR
равно 1, только если ровно один его входов равен 1, в противном случае оно равно 0. NOT
равно 1, только если его вход равен 0, в противном случае это 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
и or
):
packed_val = ((val1 & 15) << 4) | (val2 & 15)
& 15
будет обеспечивать, чтобы оба значения имели только младшие 4 бит. << 4
- это 4-битный сдвиг влево для перемещения val1
в верхние 4 бита 8-битного значения. |
просто объединяет эти два вместе. Если val1
равно 7 и val2
равно 4:
val1 val2
==== ====
& 15 (and) xxxx-0111 xxxx-0100 & 15
<< 4 (left) 0111-0000 |
| |
+-------+-------+
|
| (or) 0111-0100