Python разрядтық операторлары (логикалық өнім, логикалық НЕМЕСЕ, эксклюзивті НЕМЕСЕ, инверсия, ауысым)

Іскерлік

Python сәйкесінше екілік бүтін түр int мәнінің әрбір битінде логикалық конъюнкцияны, логикалық дизъюнкцияны, эксклюзивті дизъюнкцияны, разрядтық инверсияны, солға разрядты жылжытуды және оңға разрядты жылжытуды орындайтын келесі разрядтық операторларды қамтамасыз етеді.

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

Бұл бөлімде біз алдымен келесіні түсіндіреміз.

  • қиылысу(AND) :&
  • дизъюнкция(OR) :|
  • ЭКСКЛЮЗИВ-НЕМЕСЕ операция(XOR) :^

Әрі қарай, біз келесілерді талқылаймыз.

  • Теріс бүтін сандарға разрядтық амалдар
  • аздап айналдыру( NOT) :~
  • бит жылжу:<<,>>

Бүтін сандарды екілік, сегіздік және он алтылық жүйеде жазу жолы және екілік, сегіздік және он алтылық сандар мен жолдарды келесі функцияларды пайдаланып түрлендіру жолы туралы қосымша ақпаратты келесі мақаланы қараңыз.

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

Сондай-ақ, биттік амалдардың орнына логикалық мәндердегі (шын, жалған) логикалық операциялар (логикалық операциялар) үшін келесі мақаланы қараңыз. және,немесе &,| орнына пайдаланыңыз.

қиылысу(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) :^оператор

bin() арқылы екілік белгілеудегі жолға түрлендіру нәтижесімен біріктірілген ^ операторын пайдаланатын логикалық өнім (XOR) мысалы.

print(x ^ y)
print(bin(x ^ y))
# 3
# 0b11

Әр логикалық бит үшін кіріс пен шығыс арасындағы байланыс ЖӘНЕ, НЕМЕСЕ және 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)Бұл мән x кіріс мәнін екінің толықтауыш түрі ретінде қарастыруға және барлық биттерді инверсиялауға тең.

Жоғарыда айтылғандай, Python тілінде теріс бүтін сан bin(), format() арқылы екілік жолға түрлендірілсе, ол екінің толықтауыш түрінде емес, минус таңбасы бар абсолютті мәнде болады. Сондықтан ~x мәнін тікелей жолға түрлендіру бастапқы мәннің биттері төңкерілген жолға әкелмейді.

x = 9  # 0b1001

print(~x)
print(bin(~x))
# -10
# -0b1010

ЖӘНЕ операциясын орындап, оны екі толықтауыш бейнелеу жолына айналдырғанда, бастапқы мәннің разрядтары инверттелгенін көреміз.

Бұған қоса, мысалы, сол күйінде төңкерілген 4 разрядты бит жолы болып табылатын бит жолын алу үшін (белгі биті өткізілмейді), ANDed мәні үшін нөлдерді төмендегідей толтыру үшін format() пайдаланыңыз.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

Теріс мәндер үшін белгі биті ұзартылады және ауыстырылады, ал оң/теріс таңба өзгеріссіз қалады. Теріс мән – солға қарай 1s жолының кескіні.

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