Python bitwise operators (ផលិតផលឡូជីខល ឡូជីខល OR, ផ្តាច់មុខ OR, បញ្ច្រាស់, shift)

អាជីវកម្ម

Python ផ្តល់នូវប្រតិបត្តិករ bitwise ខាងក្រោម ដែលអនុវត្តការភ្ជាប់ឡូជីខល ការបំបែកតក្កវិជ្ជា ការផ្តាច់ផ្តាច់មុខ ការបញ្ច្រាស់ប៊ីត ការផ្លាស់ប្តូរប៊ីតឆ្វេង និងការផ្លាស់ប្តូរប៊ីតស្តាំលើប៊ីតនីមួយៗនៃប្រភេទចំនួនគត់គោលពីរប្រភេទ int តម្លៃរៀងៗខ្លួន។

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

ក្នុង​ផ្នែក​នេះ យើង​ពន្យល់​ជា​បឋម​ដូច​តទៅ។

  • ប្រសព្វ(AND) :&
  • ការបំបែក(OR) :|
  • ប្រតិបត្តិការ EXCLUSIVE-OR(XOR) :^

បន្ទាប់មកយើងនឹងពិភាក្សាដូចខាងក្រោម។

  • ប្រតិបត្តិការ Bitwise លើចំនួនគត់អវិជ្ជមាន
  • ត្រឡប់បន្តិច( NOT) :~
  • ការផ្លាស់ប្តូរបន្តិច:<<,>>

សម្រាប់ព័ត៌មានបន្ថែមអំពីរបៀបសរសេរចំនួនគត់ក្នុងគោលពីរ គោលដប់ប្រាំបី និងគោលដប់ប្រាំមួយ និងរបៀបបំប្លែងលេខគោលពីរ គោលដប់ប្រាំបី និងលេខគោលដប់ប្រាំមួយ ដោយប្រើមុខងារខាងក្រោម សូមមើលអត្ថបទខាងក្រោម។

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

ដូចគ្នានេះផងដែរ សម្រាប់ប្រតិបត្តិការឡូជីខល (ប្រតិបត្តិការប៊ូលីន) លើតម្លៃប៊ូលីន (ពិត មិនពិត) ជំនួសឱ្យប្រតិបត្តិការប៊ីត សូមមើលអត្ថបទខាងក្រោម។ ប្រើ និង ឬជំនួស &,|។

ប្រសព្វ(AND) :&ប្រតិបត្តិករ

នេះជាឧទាហរណ៍នៃឡូជីខល AND ដោយប្រើ & operator ជាមួយនឹងលទ្ធផលបានបំប្លែងទៅជាខ្សែអក្សរក្នុងសញ្ញាគោលពីរដោយ bin()។

x = 9   # 0b1001
y = 10  # 0b1010

print(x & y)
print(bin(x & y))
# 8
# 0b1000

ការបំបែក(OR) :|ប្រតិបត្តិករ

ឧទាហរណ៍នៃផលិតផលឡូជីខល (OR) ដោយប្រើ | operator ជាមួយនឹងលទ្ធផលបានបំប្លែងទៅជា string ក្នុង binary notation ដោយ bin() និង output ជាមួយគ្នា។

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)
11110
10011
01011
00000

ប្រតិបត្តិការ Bitwise លើចំនួនគត់អវិជ្ជមាន

នៅពេលដែលប្រតិបត្តិការប៊ីតត្រូវបានអនុវត្តលើចំនួនគត់អវិជ្ជមាន តម្លៃត្រូវបានដំណើរការដូចជាប្រសិនបើវាត្រូវបានបង្ហាញក្នុងទម្រង់បំពេញបន្ថែមរបស់ពីរ។

ទោះជាយ៉ាងណាក៏ដោយ សូមចំណាំថា ប្រសិនបើអ្នកបំប្លែងចំនួនគត់អវិជ្ជមានទៅជាខ្សែអក្សរគោលពីរដោយប្រើ 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

ត្រឡប់បន្តិច:~ប្រតិបត្តិករ

~ ឧទាហរណ៍​នៃ​ការ​ត្រឡប់​បន្តិច​ជាមួយ​ប្រតិបត្តិករ​។

ការ​បញ្ច្រាស​ប៊ីត​មិន​មែន​ជា​តម្លៃ​នៃ​ការ​ដាក់​បញ្ច្រាស​ប៊ីត​នោះ​ទេ។ តម្លៃត្រឡប់នៅពេលប្រើប្រតិបត្តិករនេះគឺដូចខាងក្រោម។
~x#ERROR!-(x+1)

-(x+1)តម្លៃនេះគឺស្មើនឹងការពិចារណាតម្លៃបញ្ចូល x ជាទម្រង់បំពេញបន្ថែមរបស់ពីរ ហើយដាក់បញ្ច្រាសប៊ីតទាំងអស់។

ដូចដែលបានរៀបរាប់ខាងលើនៅក្នុង Python នៅពេលដែលចំនួនគត់អវិជ្ជមានត្រូវបានបំប្លែងទៅជា binary string ដោយប្រើ bin(), format(), etc. វាមិនមែននៅក្នុងទម្រង់បំពេញបន្ថែមរបស់ two ទេ ប៉ុន្តែនៅក្នុងតម្លៃដាច់ខាតជាមួយនឹងសញ្ញាដក។ ដូច្នេះ ការបំប្លែង ~x ដោយផ្ទាល់ទៅខ្សែអក្សរនឹងមិននាំឱ្យខ្សែអក្សរដែលមានប៊ីតនៃតម្លៃដើមដាក់បញ្ច្រាសនោះទេ។

x = 9  # 0b1001

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

នៅពេលដែលយើងអនុវត្តប្រតិបត្តិការ AND ហើយបង្វែរវាទៅជាខ្សែអក្សរនៃតំណាងការបំពេញបន្ថែមរបស់ពីរ យើងអាចឃើញថាប៊ីតនៃតម្លៃដើមត្រូវបានដាក់បញ្ច្រាស។

បន្ថែមពីលើនេះ ជាឧទាហរណ៍ ដើម្បីទទួលបានខ្សែអក្សរប៊ីតដែលជាខ្សែអក្សរប៊ីត 4 ខ្ទង់ដែលដាក់បញ្ច្រាសដូច (សញ្ញាប៊ីតបានលុបចោល) សូមប្រើទម្រង់ () ដើម្បីបំពេញលេខសូន្យសម្រាប់តម្លៃ 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

សម្រាប់តម្លៃអវិជ្ជមាន សញ្ញាប៊ីតត្រូវបានពង្រីក និងផ្លាស់ប្តូរ ហើយសញ្ញាវិជ្ជមាន/អវិជ្ជមាននៅតែដដែល។ តម្លៃអវិជ្ជមានគឺជារូបភាពនៃបន្ទាត់ 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