ตัวดำเนินการ Bitwise คือตัวดำเนินการที่ทำงานกับค่าหลายบิต แต่มีแนวคิดทีละบิต
AND
คือ 1 ก็ต่อเมื่ออินพุตทั้งสองเป็น 1 มิฉะนั้นจะเป็น 0
OR
คือ 1 ถ้าอินพุตหนึ่งหรือทั้งสองอินพุตเป็น 1 มิฉะนั้นจะเป็น 0
XOR
คือ 1 ก็ต่อเมื่ออินพุตตัวใดตัวหนึ่งเป็น 1 เท่านั้นมิฉะนั้นจะเป็น 0
NOT
คือ 1 ก็ต่อเมื่ออินพุตเป็น 0 มิฉะนั้นจะเป็น 0
สิ่งเหล่านี้มักจะแสดงเป็นตารางความจริงได้ดีที่สุด ความเป็นไปได้ในการป้อนข้อมูลอยู่ที่ด้านบนและด้านซ้ายบิตผลลัพธ์คือหนึ่งในสี่ (สองในกรณีที่ไม่ใช่เนื่องจากมีเพียงอินพุตเดียว) ที่แสดงที่จุดตัดของอินพุต
AND | 0 1 OR | 0 1 XOR | 0 1 NOT | 0 1
----+----- ---+---- ----+---- ----+----
0 | 0 0 0 | 0 1 0 | 0 1 | 1 0
1 | 0 1 1 | 1 1 1 | 1 0
ตัวอย่างหนึ่งคือถ้าคุณต้องการเพียง 4 บิตล่างของจำนวนเต็มคุณและมันด้วย 15 (ไบนารี 1111) ดังนั้น:
201: 1100 1001
AND 15: 0000 1111
------------------
IS 9 0000 1001
ศูนย์บิตใน 15 ในกรณีนั้นทำหน้าที่เป็นตัวกรองได้อย่างมีประสิทธิภาพบังคับให้บิตในผลลัพธ์เป็นศูนย์เช่นกัน
นอกจากนี้>>
และ<<
มักจะรวมเป็นตัวดำเนินการแบบบิตและพวกเขาจะ "เลื่อน" ค่าตามลำดับไปทางขวาและซ้ายด้วยจำนวนบิตที่แน่นอนทิ้งบิตที่ม้วนปลายที่คุณกำลังขยับไปและป้อนเป็นศูนย์บิตที่ ปลาย ๆ
ตัวอย่างเช่น:
1001 0101 >> 2 gives 0010 0101
1111 1111 << 4 gives 1111 0000
โปรดทราบว่าการเลื่อนไปทางซ้ายใน Python นั้นผิดปกติเนื่องจากไม่ได้ใช้ความกว้างคงที่ซึ่งบิตจะถูกละทิ้ง - ในขณะที่หลายภาษาใช้ความกว้างคงที่ตามประเภทข้อมูล Python เพียงแค่ขยายความกว้างเพื่อรองรับบิตพิเศษ เพื่อให้ได้พฤติกรรมการทิ้งใน Python คุณสามารถทำตามการเลื่อนไปทางซ้ายด้วยการหมุนตามเข็มนาฬิกาand
เช่นค่า8 บิตเลื่อนไปทางซ้ายสี่บิต:
bits8 = (bits8 << 4) & 255
โดยที่ในใจตัวอย่างของผู้ประกอบการระดับบิตอีกคือถ้าคุณมีสองค่า 4 บิตที่คุณต้องการที่จะแพ็คเป็นหนึ่งใน 8 บิตคุณสามารถใช้ทั้งสามของผู้ประกอบการของคุณ ( left-shift
, and
และor
):
packed_val = ((val1 & 15) << 4) | (val2 & 15)
- การ
& 15
ดำเนินการจะทำให้แน่ใจว่าทั้งสองค่ามีเพียง 4 บิตที่ต่ำกว่า
<< 4
เป็นกะ 4 บิตซ้ายไปย้ายval1
เข้ามาอยู่อันดับ 4 บิตของมูลค่า 8 บิต
|
เพียงรวมทั้งสองเข้าด้วยกัน
ถ้าval1
เป็น 7 และval2
เป็น 4:
val1 val2
==== ====
& 15 (and) xxxx-0111 xxxx-0100 & 15
<< 4 (left) 0111-0000 |
| |
+-------+-------+
|
| (or) 0111-0100