Python Language
Operatory bitowe
Szukaj…
Wprowadzenie
Operacje bitowe zmieniają ciągi binarne na poziomie bitów. Te operacje są niezwykle proste i są bezpośrednio obsługiwane przez procesor. Te kilka operacji jest niezbędnych do pracy ze sterownikami urządzeń, grafiką niskiego poziomu, kryptografią i komunikacją sieciową. Ta sekcja zawiera przydatną wiedzę i przykłady bitowych operatorów Pythona.
Składnia
x << y # Bitowe przesunięcie w lewo
x >> y # Bitowe przesunięcie w prawo
x i y # Bitowe ORAZ
x | y # Bitowe OR
~ x # Bitowe NIE
x ^ y # Bitowy XOR
Bitowe AND
Operator &
wykona binarny AND , gdzie bit jest kopiowany, jeśli istnieje w obu operandach. To znaczy:
# 0 & 0 = 0
# 0 & 1 = 0
# 1 & 0 = 0
# 1 & 1 = 1
# 60 = 0b111100
# 30 = 0b011110
60 & 30
# Out: 28
# 28 = 0b11100
bin(60 & 30)
# Out: 0b11100
Bitowe OR
The |
operator wykona binarny „lub”, gdzie bit jest kopiowany, jeśli istnieje w dowolnym operandzie. To znaczy:
# 0 | 0 = 0
# 0 | 1 = 1
# 1 | 0 = 1
# 1 | 1 = 1
# 60 = 0b111100
# 30 = 0b011110
60 | 30
# Out: 62
# 62 = 0b111110
bin(60 | 30)
# Out: 0b111110
Bitowy XOR (wyłączny LUB)
Operator ^
wykona binarny XOR, w którym binarny 1
jest kopiowany wtedy i tylko wtedy, gdy jest to wartość dokładnie jednego argumentu. Innym sposobem stwierdzenia tego jest to, że wynik wynosi 1
tylko wtedy, gdy operandy są różne. Przykłady zawierają:
# 0 ^ 0 = 0
# 0 ^ 1 = 1
# 1 ^ 0 = 1
# 1 ^ 1 = 0
# 60 = 0b111100
# 30 = 0b011110
60 ^ 30
# Out: 34
# 34 = 0b100010
bin(60 ^ 30)
# Out: 0b100010
Przesunięcie bitowe w lewo
Operator <<
wykona bitowe „przesunięcie w lewo”, w którym wartość lewego operandu jest przesuwana w lewo o liczbę bitów podaną przez prawy operand.
# 2 = 0b10
2 << 2
# Out: 8
# 8 = 0b1000
bin(2 << 2)
# Out: 0b1000
Wykonanie przesunięcia w lewo o 1
bit jest równoważne pomnożeniu przez 2
:
7 << 1
# Out: 14
Wykonanie przesunięcia lewego bitu o n
jest równoważne pomnożeniu przez 2**n
:
3 << 4
# Out: 48
Przesunięcie bitowe w prawo
Operator >>
wykona bitowe „przesunięcie w prawo”, w którym wartość lewego operandu jest przesuwana w prawo o liczbę bitów podaną przez prawy operand.
# 8 = 0b1000
8 >> 2
# Out: 2
# 2 = 0b10
bin(8 >> 2)
# Out: 0b10
Wykonanie przesunięcia o 1
bit w prawo jest równoważne dzieleniu liczb całkowitych przez 2
:
36 >> 1
# Out: 18
15 >> 1
# Out: 7
Wykonanie przesunięcia bitu w prawo o n
jest równoważne dzieleniu liczb całkowitych przez 2**n
:
48 >> 4
# Out: 3
59 >> 3
# Out: 7
Bitowe NIE
Operator ~
przerzuci wszystkie bity liczby. Ponieważ komputery używają podpisanych reprezentacji liczb - przede wszystkim notacji dopełniającej dwa do kodowania ujemnych liczb binarnych, w których liczby ujemne są zapisywane z wiodącą (1) zamiast wiodącej zera (0).
Oznacza to, że jeśli użyjesz 8 bitów do przedstawienia liczb uzupełniających do dwóch, potraktujesz wzorce od 0000 0000
do 0111 1111
aby reprezentować liczby od 0 do 127 i zarezerwujesz 1xxx xxxx
do przedstawienia liczb ujemnych.
Ośmiobitowe liczby uzupełniające do dwóch
Bity | Niepodpisana wartość | Wartość uzupełnienia do dwóch |
---|---|---|
0000 0000 | 0 | 0 |
0000 0001 | 1 | 1 |
0000 0010 | 2) | 2) |
0111 1110 | 126 | 126 |
0111 1111 | 127 | 127 |
1000 0000 | 128 | -128 |
1000 0001 | 129 | -127 |
1000 0010 | 130 | -126 |
1111 1110 | 254 | -2 |
1111 1111 | 255 | -1 |
Zasadniczo oznacza to, że podczas gdy 1010 0110
ma wartość bez znaku 166 (uzyskaną przez dodanie (128 * 1) + (64 * 0) + (32 * 1) + (16 * 0) + (8 * 0) + (4 * 1) + (2 * 1) + (1 * 0)
), ma wartość uzupełnienia do dwóch wynoszącą -90 (uzyskaną przez dodanie (128 * 1) - (64 * 0) - (32 * 1) - (16 * 0) - (8 * 0) - (4 * 1) - (2 * 1) - (1 * 0)
i uzupełnienie wartości).
W ten sposób liczby ujemne spadają do -128 ( 1000 0000
). Zero (0) jest reprezentowane jako 0000 0000
, a minus jeden (-1) jako 1111 1111
.
Ogólnie jednak oznacza to ~n = -n - 1
.
# 0 = 0b0000 0000
~0
# Out: -1
# -1 = 0b1111 1111
# 1 = 0b0000 0001
~1
# Out: -2
# -2 = 1111 1110
# 2 = 0b0000 0010
~2
# Out: -3
# -3 = 0b1111 1101
# 123 = 0b0111 1011
~123
# Out: -124
# -124 = 0b1000 0100
Uwaga: ogólny efekt tej operacji po zastosowaniu do liczb dodatnich można podsumować:
~n -> -|n+1|
A następnie, po zastosowaniu do liczb ujemnych, odpowiedni efekt to:
~-n -> |n-1|
Poniższe przykłady ilustrują tę ostatnią zasadę ...
# -0 = 0b0000 0000
~-0
# Out: -1
# -1 = 0b1111 1111
# 0 is the obvious exception to this rule, as -0 == 0 always
# -1 = 0b1000 0001
~-1
# Out: 0
# 0 = 0b0000 0000
# -2 = 0b1111 1110
~-2
# Out: 1
# 1 = 0b0000 0001
# -123 = 0b1111 1011
~-123
# Out: 122
# 122 = 0b0111 1010
Operacje w miejscu
Wszystkie operatory bitowe (oprócz ~
) mają swoje własne wersje na miejscu
a = 0b001
a &= 0b010
# a = 0b000
a = 0b001
a |= 0b010
# a = 0b011
a = 0b001
a <<= 2
# a = 0b100
a = 0b100
a >>= 2
# a = 0b001
a = 0b101
a ^= 0b011
# a = 0b110