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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow