Python предлага следните побитови оператори, които изпълняват съответно логическа конюнкция, логическа дизюнкция, ексклузивна дизюнкция, побитова инверсия, ляво и дясно преместване на всеки бит от двоична стойност от целочислен тип int.
&
|
^
~
<<
>>
В този раздел първо ще обясним следното.
- кръстовище (AND) :
&
- дизюнкция (OR) :
|
- Операция EXCLUSIVE-OR (XOR) :
^
След това ще обсъдим следното.
- Побитови операции върху отрицателни цели числа
- обръщане на битове ( NOT) :
~
- преместване на битове :
<<
,>>
За повече информация как да записвате цели числа в двоична, осмична и шестнадесетична система и как да преобразувате двоични, осмични и шестнадесетични числа и низове с помощта на следните функции, вижте следната статия.
bin()
oct()
hex()
format()
- Свързани статии:Конвертиране на двоични, осмични и шестнадесетични числа и низове във и от тях в Python
Също така, за логически операции (булеви операции) върху булеви стойности (true, false) вместо побитови операции, вижте следната статия. Използвайте и,или вместо &,|.
- Свързани статии:Логическите оператори и, или и не на Python (логическа конюнкция, дизюнкция, отрицание)
кръстовище (AND) : &оператор
Това е пример за логическо И с помощта на оператора &, като резултатът е преобразуван в низ в двоичен запис с помощта на bin().
x = 9 # 0b1001 y = 10 # 0b1010 print(x & y) print(bin(x & y)) # 8 # 0b1000
дизюнкция (OR) : |оператор
Пример за логическо произведение (ИЛИ) с помощта на оператора |, като резултатът се преобразува в низ в двоичен запис с помощта на bin() и се извежда заедно.
print(x | y) print(bin(x | y)) # 11 # 0b1011
Операция EXCLUSIVE-OR (XOR) : ^оператор
Пример за логическо произведение (XOR) с помощта на оператора ^, комбинирано с резултата от преобразуването в низ в двоичен запис с помощта на bin().
print(x ^ y) print(bin(x ^ y)) # 3 # 0b11
Връзката между входа и изхода за всеки бит на логическите комбинации AND, OR и XOR е показана в таблицата по-долу.
Вход 1 | Вход 2 | кръстовище (AND) | дизюнкция (OR) | Операция EXCLUSIVE-OR (XOR) |
---|---|---|---|---|
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
0 | 1 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 0 |
Побитови операции върху отрицателни цели числа
Когато се извършва побитова операция върху отрицателно цяло число, стойността се обработва така, сякаш е изразена във вид на двойка.
Обърнете внимание обаче, че ако преобразувате отрицателно цяло число в двоичен низ с помощта на bin() или format(), абсолютната стойност ще има знак минус вместо формат с две допълнения.
Ако искате да получите низ с представяне на двойка, вземете AND с максималния брой необходими битови цифри, както е показано по-долу.
- За 4-битови
0b1111
(=0xf
) - За 8-битови
0xff
- За 16-битови
0xffff
Можете да получите низ, представен по двойка (всеки бит се инвертира и се добавя 1).
x = -9 print(x) print(bin(x)) # -9 # -0b1001 print(bin(x & 0xff)) print(format(x & 0xffff, 'x')) # 0b11110111 # fff7
- Свързани статии:Конвертиране на двоични, осмични и шестнадесетични числа и низове във и от тях в Python
обръщане на битове : ~оператор
~ пример за обръщане на битове с оператори.
Побитовата инверсия не е просто стойността на всеки инвертиран бит. Върнатата стойност при използване на този оператор е следната.~x
=-(x+1)
-(x+1)
Тази стойност е еквивалентна на разглеждане на входната стойност x като форма на допълнение на две и инвертиране на всички битове.
Както беше споменато по-горе, в Python, когато отрицателно цяло число се преобразува в двоичен низ с помощта на bin(), format() и т.н., то не е във вид на допълнение на две, а в абсолютна стойност със знак минус. Следователно, ако конвертирате ~x директно в низ, няма да получите низ с инвертирани битове на оригиналната стойност.
x = 9 # 0b1001 print(~x) print(bin(~x)) # -10 # -0b1010
Когато извършим операцията AND и я превърнем в низ от две допълнения, виждаме, че битовете на първоначалната стойност са инвертирани.
Освен това, за да получите например низ от битове, който представлява 4-цифрен низ от битове, инвертиран така, както е (пропуснат е бит със знак), използвайте format(), за да попълните нулите за ANDed стойността, както следва'04b'
print(bin(~x & 0xff)) print(format(~x & 0b1111, '04b')) # 0b11110110 # 0110
преместване на битове : << , >>
Примери за ляво и дясно преместване на битове с помощта на оператори за преместване на битове.
x = 9 # 0b1001 print(x << 1) print(bin(x << 1)) # 18 # 0b10010 print(x >> 1) print(bin(x >> 1)) # 4 # 0b100
За отрицателни стойности битът на знака се разширява и измества, а положителният\отрицателният знак остава същият. Отрицателната стойност е образ на ред от единици чак до лявата страна.
x = -9 print(bin(x)) print(bin(x & 0xff)) # -0b1001 # 0b11110111 print(x << 1) print(bin(x << 1)) print(bin((x << 1) & 0xff)) # -18 # -0b10010 # 0b11101110 print(x >> 1) print(bin(x >> 1)) print(bin((x >> 1) & 0xff)) # -5 # -0b101 # 0b11111011
По-добре е да мислим в термини на низове от изрази с две допълнения, тъй като мисленето в термини на числа не е ясно.