Python забяспечвае наступныя паразрадныя аператары, якія выконваюць лагічную кан’юнкцыю, лагічную дыз’юнкцыю, эксклюзіўную дыз’юнцыю, пабітовую інверсію, зрух біта ўлева і зрух біта ўправа для кожнага біта двайковага цэлага тыпу int значэння адпаведна.
&
|
^
~
<<
>>
У гэтым раздзеле мы спачатку растлумачым наступнае.
- скрыжаванне(AND) :
&
- дыз’юнцыя(OR) :
|
- ЭКСКЛЮЗІВНА-АБО аперацыя(XOR) :
^
Далей мы абмяркуем наступнае.
- Паразрадныя аперацыі над цэлымі адмоўнымі лікамі
- біт пераварот( NOT) :
~
- бітавы зрух:
<<
,>>
Для атрымання дадатковай інфармацыі аб тым, як запісваць цэлыя лікі ў двайковым, васьмярковым і шаснаццатковым, і як пераўтварыць двайковыя, васьмярковыя і шаснаццатковыя лікі і радкі з дапамогай наступных функцый, глядзіце ў наступным артыкуле.
bin()
oct()
hex()
format()
- Падобныя артыкулы:Пераўтварэнне двайковых, васьмярковых і шаснаццатковых лікаў і радкоў адзін з аднаго ў Python
Акрамя таго, для лагічных аперацый (лагічных аперацый) з булевымі значэннямі (праўда, ілжыва) замест паразрадных аперацый звярніцеся да наступнага артыкула. Выкарыстоўвайце and,or замест &,|.
- Падобныя артыкулы:Лагічныя аператары Python and, or, and not (лагічнае спалучэнне, дыз’юнцыя, адмаўленне)
скрыжаванне(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
ЭКСКЛЮЗІВНА-АБО аперацыя(XOR) :^аператар
Прыклад лагічнага прадукту (XOR) з выкарыстаннем аператара ^ у спалучэнні з вынікам пераўтварэння ў радок у двайковым абазначэнні з дапамогай bin().
print(x ^ y) print(bin(x ^ y)) # 3 # 0b11
Суадносіны паміж уваходам і выхадам для кожнага біта лагічных AND, OR і XOR паказана ў табліцы ніжэй.
Увод 1 | Увод 2 | скрыжаванне(AND) | дыз’юнцыя(OR) | ЭКСКЛЮЗІВНА-АБО аперацыя(XOR) |
---|---|---|---|---|
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
0 | 1 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 0 |
Паразрадныя аперацыі над цэлымі адмоўнымі лікамі
Калі паразрадная аперацыя выконваецца над адмоўным цэлым лікам, значэнне апрацоўваецца так, як калі б яно было выражана ў форме дапаўнення да двух.
Аднак заўважце, што калі вы пераўтворыце адмоўнае цэлае ў двайковы радок з дапамогай bin() або format(), абсалютнае значэнне будзе мець знак мінус замест фармату дапаўнення да двойкі.
Калі вы хочаце атрымаць радок з прадстаўленнем дапаўнення два, вазьміце І з максімальнай неабходнай колькасцю бітавых лічбаў, як паказана ніжэй.
- Для 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
#ERROR!-(x+1)
-(x+1)
Гэта значэнне эквівалентна разгляду ўваходнага значэння х у выглядзе дапаўнення да двух і інвертавання ўсіх бітаў.
Як згадвалася вышэй, у Python, калі адмоўнае цэлае лік пераўтворыцца ў двайковы радок з дапамогай bin(), format() і г.д., яно не ў дапаўненні да двух, а ў абсалютным значэнні са знакам мінус. Такім чынам, пераўтварэнне ~x непасрэдна ў радок не прывядзе да атрымання радка з перавернутымі бітамі зыходнага значэння.
x = 9 # 0b1001 print(~x) print(bin(~x)) # -10 # -0b1010
Калі мы выконваем аперацыю І і ператвараем яе ў радок прадстаўлення дапаўнення, мы бачым, што біты зыходнага значэння інвертаваны.
Акрамя таго, напрыклад, каб атрымаць бітавы радок, які ўяўляе сабой 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
Для адмоўных значэнняў біт знака пашыраецца і ссоўваецца, а станоўчы/адмоўны знак застаецца ранейшым. Адмоўнае значэнне – гэта выява лініі з 1 злева.
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
Лепш думаць у тэрмінах радкоў выразаў дапаўнення двойкі, так як мысленне ў тэрмінах лічбаў незразумела.