Python Language
Bitvisa operatörer
Sök…
Introduktion
Bitvisa operationer förändrar binära strängar på bitnivån. Dessa operationer är otroligt grundläggande och stöds direkt av processorn. Dessa få operationer är nödvändiga för att arbeta med enhetsdrivrutiner, grafik på låg nivå, kryptografi och nätverkskommunikation. Det här avsnittet innehåller användbar kunskap och exempel på Pythons bitvisa operatörer.
Syntax
x << y # Bitvis vänsterförskjutning
x >> y # Bitvis högerskift
x & y # Bitvis OCH
x | y # Bitvis ELLER
~ x # Bitvis INTE
x ^ y # Bitvis XOR
Bitvis OCH
Operatören &
utför en binär OCH , där en bit kopieras om den finns i båda operanderna. Det betyder:
# 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
Bitvis ELLER
Den |
operatören kommer att utföra en binär "eller" där en bit kopieras om den finns i endera operand. Det betyder:
# 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
Bitvis XOR (exklusivt ELLER)
^
-Operatören kommer att utföra en binär XOR där en binär 1
kopieras om och bara om det är värdet på exakt en operand. Ett annat sätt att säga detta är att resultatet endast är 1
om operanderna är olika. Exempel inkluderar:
# 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
Bitvis vänsterförskjutning
<<
-operatören kommer att utföra en bitvis "vänsterskift", där den vänstra operandens värde flyttas åt vänster med antalet bitar som ges av höger operand.
# 2 = 0b10
2 << 2
# Out: 8
# 8 = 0b1000
bin(2 << 2)
# Out: 0b1000
Att utföra en vänster bitskift på 1
motsvarar multiplikation med 2
:
7 << 1
# Out: 14
Att utföra en vänster bitskift av n
motsvarar multiplikation med 2**n
:
3 << 4
# Out: 48
Bitvis högerväxling
>>
-operatören kommer att utföra en bitvis "högerskift", där den vänstra operandens värde flyttas åt höger med antalet bitar som ges av högeroperand.
# 8 = 0b1000
8 >> 2
# Out: 2
# 2 = 0b10
bin(8 >> 2)
# Out: 0b10
Att utföra en rätt bitskift på 1
motsvarar heltal med 2
:
36 >> 1
# Out: 18
15 >> 1
# Out: 7
Att utföra en rätt bitskift av n
motsvarar heltal med 2**n
:
48 >> 4
# Out: 3
59 >> 3
# Out: 7
Bitvis INTE
Operatören ~
vänder alla bitar i numret. Eftersom datorer använder undertecknade nummerrepresentationer - framför allt är de två komplementnotationen för att koda negativa binära siffror där negativa nummer skrivs med en ledande (1) istället för en ledande noll (0).
Det betyder att om du använde 8 bitar för att representera dina två komplementnummer skulle du behandla mönster från 0000 0000
till 0111 1111
att representera siffror från 0 till 127 och reservera 1xxx xxxx
att representera negativa siffror.
Åtta bitars komplementnummer
bits | Osignerat värde | Två-komplement värde |
---|---|---|
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 |
I huvudsak betyder detta att medan 1010 0110
har ett osignerat värde på 166 (nås genom att lägga till (128 * 1) + (64 * 0) + (32 * 1) + (16 * 0) + (8 * 0) + (4 * 1) + (2 * 1) + (1 * 0)
), den har ett tvåkompensationsvärde på -90 (nås genom att lägga till (128 * 1) - (64 * 0) - (32 * 1) - (16 * 0) - (8 * 0) - (4 * 1) - (2 * 1) - (1 * 0)
och kompletterar värdet).
På detta sätt varierar negativa nummer till -128 ( 1000 0000
). Noll (0) representeras som 0000 0000
och minus en (-1) som 1111 1111
.
I allmänhet betyder detta dock ~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
Observera att den totala effekten av denna operation när den tillämpas på positiva siffror kan sammanfattas:
~n -> -|n+1|
Och när den tillämpas på negativa siffror är motsvarande effekt:
~-n -> |n-1|
Följande exempel illustrerar denna sista regel ...
# -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
Operationer på plats
Alla Bitvis-operatörer (utom ~
) har sina egna versioner på plats
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