Пабітавыя аператары Python (лагічны прадукт, лагічнае АБО, выключнае АБО, інверсія, зрух)

Бізнэс

Python забяспечвае наступныя паразрадныя аператары, якія выконваюць лагічную кан’юнкцыю, лагічную дыз’юнкцыю, эксклюзіўную дыз’юнцыю, пабітовую інверсію, зрух біта ўлева і зрух біта ўправа для кожнага біта двайковага цэлага тыпу int значэння адпаведна.

  • &
  • |
  • ^
  • ~
  • <<
  • >>

У гэтым раздзеле мы спачатку растлумачым наступнае.

  • скрыжаванне(AND) :&
  • дыз’юнцыя(OR) :|
  • ЭКСКЛЮЗІВНА-АБО аперацыя(XOR) :^

Далей мы абмяркуем наступнае.

  • Паразрадныя аперацыі над цэлымі адмоўнымі лікамі
  • біт пераварот( NOT) :~
  • бітавы зрух:<<,>>

Для атрымання дадатковай інфармацыі аб тым, як запісваць цэлыя лікі ў двайковым, васьмярковым і шаснаццатковым, і як пераўтварыць двайковыя, васьмярковыя і шаснаццатковыя лікі і радкі з дапамогай наступных функцый, глядзіце ў наступным артыкуле.

  • bin()
  • oct()
  • hex()
  • format()

Акрамя таго, для лагічных аперацый (лагічных аперацый) з булевымі значэннямі (праўда, ілжыва) замест паразрадных аперацый звярніцеся да наступнага артыкула. Выкарыстоўвайце and,or замест &,|.

скрыжаванне(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)
11110
10011
01011
00000

Паразрадныя аперацыі над цэлымі адмоўнымі лікамі

Калі паразрадная аперацыя выконваецца над адмоўным цэлым лікам, значэнне апрацоўваецца так, як калі б яно было выражана ў форме дапаўнення да двух.

Аднак заўважце, што калі вы пераўтворыце адмоўнае цэлае ў двайковы радок з дапамогай 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

біт пераварот:~аператар

~прыклад перагортвання бітаў з аператарамі.

Пабітавая інверсія – гэта не проста значэнне кожнага інвертаванага біта. Зваротнае значэнне пры выкарыстанні гэтага аператара выглядае наступным чынам.
~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

Лепш думаць у тэрмінах радкоў выразаў дапаўнення двойкі, так як мысленне ў тэрмінах лічбаў незразумела.

Copied title and URL