Python จัดเตรียมโอเปอเรเตอร์ระดับบิตต่อไปนี้ ซึ่งดำเนินการร่วมเชิงตรรกะ แยกตรรกะ แยกเฉพาะ ผกผันระดับบิต เลื่อนบิตซ้าย และเปลี่ยนบิตขวาในแต่ละบิตของค่า int ชนิดจำนวนเต็มไบนารีตามลำดับ
&
|
^
~
<<
>>
ในส่วนนี้ ก่อนอื่นเราจะอธิบายสิ่งต่อไปนี้
- จุดตัด(AND) :
&
- disjunction(OR) :
|
- การดำเนินการพิเศษ-OR(XOR) :
^
ต่อไปเราจะพูดถึงต่อไปนี้
- การดำเนินการระดับบิตบนจำนวนเต็มลบ
- พลิกบิต( NOT) :
~
- กะบิต:
<<
,>>
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการเขียนจำนวนเต็มในเลขฐานสอง ฐานแปด และเลขฐานสิบหก และวิธีการแปลงเลขฐานสอง ฐานแปด และเลขฐานสิบหกโดยใช้ฟังก์ชันต่อไปนี้ ให้ดูบทความต่อไปนี้
bin()
oct()
hex()
format()
- บทความที่เกี่ยวข้อง:แปลงเลขฐานสอง ฐานแปด และฐานสิบหกและสตริงเป็นและจากกันใน Python
นอกจากนี้ สำหรับการดำเนินการทางตรรกะ (การดำเนินการบูลีน) กับค่าบูลีน (จริง เท็จ) แทนการดำเนินการระดับบิต โปรดดูบทความต่อไปนี้ ใช้ และ,หรือ แทน &,|
- บทความที่เกี่ยวข้อง:ตัวดำเนินการเชิงตรรกะของ Python และหรือและไม่ใช่ (การรวมเชิงตรรกะ การแตกแยก การปฏิเสธ)
จุดตัด(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) |
---|---|---|---|---|
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
0 | 1 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 0 |
การดำเนินการระดับบิตบนจำนวนเต็มลบ
เมื่อดำเนินการระดับบิตบนจำนวนเต็มลบ ค่าจะถูกประมวลผลราวกับว่ามันถูกแสดงในรูปแบบเสริมของสอง
อย่างไรก็ตาม โปรดทราบว่าหากคุณแปลงจำนวนเต็มลบเป็นสตริงไบนารีโดยใช้ 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
- บทความที่เกี่ยวข้อง:แปลงเลขฐานสอง ฐานแปด และฐานสิบหกและสตริงเป็นและจากกันใน Python
พลิกบิต:~โอเปอเรเตอร์
~ตัวอย่างการพลิกบิตด้วยตัวดำเนินการ
การผกผันระดับบิตไม่ได้เป็นเพียงค่าของการกลับบิตแต่ละบิต ค่าที่ส่งคืนเมื่อใช้ตัวดำเนินการนี้มีดังต่อไปนี้~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
เป็นการดีกว่าที่จะคิดในแง่ของสตริงของนิพจน์เสริมของสองตัว เนื่องจากการคิดในแง่ของตัวเลขไม่ชัดเจน