ตัวดำเนินการระดับบิตของ Python (ผลิตภัณฑ์ลอจิคัล, ตรรกะ OR, OR แบบเอกสิทธิ์เฉพาะบุคคล, การผกผัน, กะ)

ธุรกิจ

Python จัดเตรียมโอเปอเรเตอร์ระดับบิตต่อไปนี้ ซึ่งดำเนินการร่วมเชิงตรรกะ แยกตรรกะ แยกเฉพาะ ผกผันระดับบิต เลื่อนบิตซ้าย และเปลี่ยนบิตขวาในแต่ละบิตของค่า int ชนิดจำนวนเต็มไบนารีตามลำดับ

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

ในส่วนนี้ ก่อนอื่นเราจะอธิบายสิ่งต่อไปนี้

  • จุดตัด(AND) :&
  • disjunction(OR) :|
  • การดำเนินการพิเศษ-OR(XOR) :^

ต่อไปเราจะพูดถึงต่อไปนี้

  • การดำเนินการระดับบิตบนจำนวนเต็มลบ
  • พลิกบิต( NOT) :~
  • กะบิต:<<,>>

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการเขียนจำนวนเต็มในเลขฐานสอง ฐานแปด และเลขฐานสิบหก และวิธีการแปลงเลขฐานสอง ฐานแปด และเลขฐานสิบหกโดยใช้ฟังก์ชันต่อไปนี้ ให้ดูบทความต่อไปนี้

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

นอกจากนี้ สำหรับการดำเนินการทางตรรกะ (การดำเนินการบูลีน) กับค่าบูลีน (จริง เท็จ) แทนการดำเนินการระดับบิต โปรดดูบทความต่อไปนี้ ใช้ และ,หรือ แทน &,|

จุดตัด(AND) :&โอเปอเรเตอร์

นี่คือตัวอย่างของตรรกะ AND โดยใช้ & โอเปอเรเตอร์โดยแปลงผลลัพธ์เป็นสตริงในรูปแบบไบนารีโดย bin()

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

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

disjunction(OR) :|โอเปอเรเตอร์

ตัวอย่างของผลิตภัณฑ์ตรรกะ (OR) โดยใช้ | โอเปอเรเตอร์โดยแปลงผลลัพธ์เป็นสตริงในรูปแบบไบนารีโดย bin() และเอาต์พุตพร้อมกัน

print(x | y)
print(bin(x | y))
# 11
# 0b1011

การดำเนินการพิเศษ-OR(XOR) :^โอเปอเรเตอร์

ตัวอย่างของผลิตภัณฑ์ตรรกะ (XOR) โดยใช้ตัวดำเนินการ ^ รวมกับผลลัพธ์ของการแปลงเป็นสตริงในรูปแบบไบนารีโดยใช้ bin()

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

ความสัมพันธ์ระหว่างอินพุตและเอาต์พุตสำหรับแต่ละบิตของตรรกะ AND, OR และ XOR แสดงในตารางด้านล่าง

อินพุต 1อินพุต2จุดตัด(AND)disjunction(OR)การดำเนินการพิเศษ-OR(XOR)
11110
10011
01011
00000

การดำเนินการระดับบิตบนจำนวนเต็มลบ

เมื่อดำเนินการระดับบิตบนจำนวนเต็มลบ ค่าจะถูกประมวลผลราวกับว่ามันถูกแสดงในรูปแบบเสริมของสอง

อย่างไรก็ตาม โปรดทราบว่าหากคุณแปลงจำนวนเต็มลบเป็นสตริงไบนารีโดยใช้ 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 เมื่อจำนวนเต็มลบถูกแปลงเป็นสตริงไบนารีโดยใช้ 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

สำหรับค่าลบ บิตเครื่องหมายถูกขยายและเลื่อน และเครื่องหมายบวก/ลบยังคงเหมือนเดิม ค่าลบคือรูปภาพของเส้น 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

เป็นการดีกว่าที่จะคิดในแง่ของสตริงของนิพจน์เสริมของสองตัว เนื่องจากการคิดในแง่ของตัวเลขไม่ชัดเจน