คำตอบ:
การใช้งาน Bitwise มีความสำคัญอย่างยิ่งเมื่อการตั้งโปรแกรมการลงทะเบียนฮาร์ดแวร์ในระบบฝังตัว ตัวอย่างเช่นโปรเซสเซอร์ทุกตัวที่ฉันเคยใช้มีการลงทะเบียนอย่างน้อยหนึ่งรายการ (โดยทั่วไปคือที่อยู่หน่วยความจำเฉพาะ) ที่ควบคุมว่ามีการเปิดหรือปิดการใช้งานอินเตอร์รัปต์หรือไม่ เพื่อให้การขัดจังหวะไฟกระบวนการปกติคือการตั้งค่าบิตเปิดใช้งานสำหรับหนึ่งประเภทขัดจังหวะในขณะที่ที่สำคัญที่สุดคือไม่ปรับเปลี่ยนบิตอื่น ๆ ในการลงทะเบียน
เมื่อการขัดจังหวะการยิงเกิดขึ้นโดยทั่วไปจะตั้งค่าบิตในการลงทะเบียนสถานะเพื่อให้รูทีนการบริการเดียวสามารถกำหนดเหตุผลที่แม่นยำสำหรับการขัดจังหวะ การทดสอบแต่ละบิตอนุญาตให้ถอดรหัสอย่างรวดเร็วของแหล่งขัดจังหวะ
ในระบบฝังตัวจำนวนมาก RAM ทั้งหมดที่มีอยู่อาจเป็น 64, 128 หรือ 256 ไบต์ (นั่นคือไบต์ไม่ใช่กิโลไบต์หรือเมกะไบต์) ในสภาพแวดล้อมนี้มันเป็นเรื่องปกติที่จะใช้หนึ่งไบต์เพื่อเก็บรายการข้อมูลหลายรายการบูลีนแฟล็ก ฯลฯ เพื่อตั้งค่าและอ่านเหล่านี้
ฉันมีเวลาหลายปีที่ทำงานกับระบบการสื่อสารผ่านดาวเทียมที่มีส่วนของข้อความ 10.5 ไบต์ ในการใช้แพ็คเก็ตข้อมูลให้ดีที่สุดข้อมูลจะต้องถูกบรรจุลงในบล็อคข้อมูลโดยไม่ปล่อยให้บิตที่ไม่ได้ใช้ระหว่างฟิลด์ ซึ่งหมายถึงการใช้ bitwise และ shift operator อย่างกว้างขวางเพื่อรับค่าข้อมูลและบรรจุลงใน payload ที่ส่ง
โดยทั่วไปคุณจะใช้มันเนื่องจากข้อควรพิจารณาเกี่ยวกับขนาดและความเร็ว การใช้งาน Bitwise นั้นง่ายมากและมักจะเร็วกว่าการคำนวณทางคณิตศาสตร์ ตัวอย่างที่จะได้รับส่วนสีเขียวของค่า RGB, (rgb / 256) % 256
วิธีการทางคณิตศาสตร์คือ (rgb >> 8) & 0xFF
มีการดำเนินงานค่าที่เหมาะสมที่คุณจะทำสิ่งที่เป็น อันหลังนั้นเร็วกว่ามากและเมื่อคุณชินกับมันแล้วมันก็ง่ายขึ้นด้วย โดยทั่วไปการใช้งานในระดับบิตจะมีบทบาทอย่างมากเมื่อคุณต้องการเข้ารหัส / ถอดรหัสข้อมูลในขนาดกะทัดรัดและรวดเร็ว
BYTE g1 = (rgb / 256) % 256;
00E51013...C1 E9 08...shr ecx,8
00E51016...88 0C 24...mov byte ptr [esp],cl
การดำเนินการประเภทนี้มักจะใช้เมื่อเขียนสำหรับระบบฝังตัวที่หน่วยความจำหรือพลังงาน CPU ถูก จำกัด
ตัวอย่างเช่นเพื่อประหยัดพื้นที่คุณสามารถเก็บตัวแปรหลายตัวในตัวแปร int 8 บิตเดียวโดยใช้แต่ละบิตเพื่อแสดงบูลีน จากนั้นคุณต้องมีวิธีที่รวดเร็วในการตั้งค่าบิตเฉพาะหรือรับค่าบิต
โดยทั่วไปเมื่อการเขียนโปรแกรมในภาษาระดับที่สูงขึ้นเช่น C # ในเครื่องคอมพิวเตอร์ตั้งโต๊ะที่มีกิกะไบต์หน่วยความจำคุณไม่สนใจจริงๆว่าแต่ละจะขึ้นเป็นไบต์ทั้งหมดbool
แต่ถ้าคุณกำลังเขียนโปรแกรมไมโครคอนโทรลเลอร์ใน C ที่มีหน่วยความจำ 2kb ทุก ๆ บิตจะนับดังนั้นความสามารถในการบรรจุ 8 bools ลงในไบต์เดียวอาจมีความสำคัญ
[Flags]
คุณสมบัติที่อนุญาตให้ใช้Enum
เป็นฟิลด์บิต ตัวอย่างเช่นFont
มีStyle
คุณสมบัติซึ่งเป็นเขตข้อมูลบิตที่ประกอบด้วยตัวหนาตัวเอียงขีดเส้นใต้และขีดทับ
การใช้งานระดับบิตนอกจากนี้ยังใช้บ่อยในตัวแปลงสัญญาณวิดีโอและเสียงด้วยเหตุผลเดียวกับในอุปกรณ์อิเล็กทรอนิกส์แบบฝัง ความสามารถในการแพ็คห้าธงและตัวตั้งเวลาสิบเอ็ดบิตไปครึ่ง int มีประโยชน์มากเมื่อคุณต้องการสร้างตัวแปลงสัญญาณวิดีโอที่มีประสิทธิภาพสูงสุด
ในความเป็นจริง MPEG 4 ยังใช้การเข้ารหัส Golomb แบบเอ็กซ์โพเนนเชียลสำหรับฟิลด์ความยาวผันแปรได้ ค่าที่แพ็คเก็ตสุดท้ายที่มีความกว้าง 17 หรือ 19 บิตอาจจะกว้างเพียงสามหรือห้าบิตแพ็คเก็ตนี้ - และคุณจะเข้าใจสิ่งนั้นด้วยการทำงานระดับบิต
เคล็ดลับที่รวมการดำเนินการทางตรรกะระดับบิตการดำเนินการเปลี่ยนแปลงระดับบิตและการดำเนินการทางคณิตศาสตร์สามารถเข้าใจได้โดยผู้ที่ได้ศึกษาการสร้างตัวบวกไบนารีโดยใช้ประตูตรรกะ (และหรือหรือไม่) นอกวงกลมนั้นมันเป็นเรื่องยากที่จะเข้าใจโดยไม่มีความคิดเห็นอย่างละเอียด
มันจะมีประโยชน์เมื่อตั้งโปรแกรมหน่วยSIMDโดยเฉพาะอย่างยิ่งถ้าสถาปัตยกรรมของ CPU ตั้งใจทิ้งคำสั่ง SIMD ไว้บางส่วนเพราะสามารถเลียนแบบคำสั่งอื่นได้บ้าง
ตัวอย่างเช่นสถาปัตยกรรมอาจไม่ได้กำหนดคำแนะนำใด ๆ สำหรับการลบค่าของกลุ่ม 16 ไบต์ แต่ที่สามารถเลียนแบบโดยการปฏิเสธ bitwise แล้วเพิ่ม 1 เช่นเดียวกันการลบสามารถถูกละเว้นเช่นกันเพราะมันสามารถเลียนแบบโดยการ ลบของตัวถูกดำเนินการที่สอง ความพร้อมใช้งานของ "เส้นทางอื่น" คือเหตุผลในการข้ามคำแนะนำบางอย่าง
ในทำนองเดียวกัน SIMD อาจรองรับการเพิ่ม 8 บิตแบบขนานโดยไม่ต้องใช้การเพิ่มเติมสำหรับองค์ประกอบที่กว้างขึ้นเช่น 16 บิต 32 บิตหรือ 64 บิต ในการลอกเลียนแบบนั้นเราต้องดึงเครื่องหมายบิตออกจากผลการคำนวณ 8 บิตจากนั้นทำการดำเนินการกับองค์ประกอบถัดไป
ข้อมูลการบรรจุ, ops ที่เร็วกว่า (การคูณ, การหารและโมดูลัสจะเร็วขึ้นอย่างมากหากปรับให้อยู่ในระดับพลังของ 2), การพลิกบิต ฯลฯ เรียนรู้และเริ่มใช้พวกเขาและคุณจะเริ่มเห็นข้อดีมากที่สุดด้วยตนเอง