ข้อดีของการใช้การดำเนินการระดับบิตคืออะไร [ปิด]


19

ต่อไปนี้การอ่านจดหมายข่าวล่าสุด CodeProject ฉันมาข้ามบทความนี้ในการดำเนินงานค่าที่เหมาะสม มันทำให้การอ่านน่าสนใจและแน่นอนฉันสามารถเห็นประโยชน์ของการตรวจสอบว่าจำนวนเต็มเป็นเลขคู่หรือคี่ แต่ทดสอบว่าบิต n-th ถูกตั้งค่าหรือไม่ อะไรคือข้อดีของสิ่งนี้

คำตอบ:


27

การใช้งาน Bitwise มีความสำคัญอย่างยิ่งเมื่อการตั้งโปรแกรมการลงทะเบียนฮาร์ดแวร์ในระบบฝังตัว ตัวอย่างเช่นโปรเซสเซอร์ทุกตัวที่ฉันเคยใช้มีการลงทะเบียนอย่างน้อยหนึ่งรายการ (โดยทั่วไปคือที่อยู่หน่วยความจำเฉพาะ) ที่ควบคุมว่ามีการเปิดหรือปิดการใช้งานอินเตอร์รัปต์หรือไม่ เพื่อให้การขัดจังหวะไฟกระบวนการปกติคือการตั้งค่าบิตเปิดใช้งานสำหรับหนึ่งประเภทขัดจังหวะในขณะที่ที่สำคัญที่สุดคือไม่ปรับเปลี่ยนบิตอื่น ๆ ในการลงทะเบียน

เมื่อการขัดจังหวะการยิงเกิดขึ้นโดยทั่วไปจะตั้งค่าบิตในการลงทะเบียนสถานะเพื่อให้รูทีนการบริการเดียวสามารถกำหนดเหตุผลที่แม่นยำสำหรับการขัดจังหวะ การทดสอบแต่ละบิตอนุญาตให้ถอดรหัสอย่างรวดเร็วของแหล่งขัดจังหวะ

ในระบบฝังตัวจำนวนมาก RAM ทั้งหมดที่มีอยู่อาจเป็น 64, 128 หรือ 256 ไบต์ (นั่นคือไบต์ไม่ใช่กิโลไบต์หรือเมกะไบต์) ในสภาพแวดล้อมนี้มันเป็นเรื่องปกติที่จะใช้หนึ่งไบต์เพื่อเก็บรายการข้อมูลหลายรายการบูลีนแฟล็ก ฯลฯ เพื่อตั้งค่าและอ่านเหล่านี้

ฉันมีเวลาหลายปีที่ทำงานกับระบบการสื่อสารผ่านดาวเทียมที่มีส่วนของข้อความ 10.5 ไบต์ ในการใช้แพ็คเก็ตข้อมูลให้ดีที่สุดข้อมูลจะต้องถูกบรรจุลงในบล็อคข้อมูลโดยไม่ปล่อยให้บิตที่ไม่ได้ใช้ระหว่างฟิลด์ ซึ่งหมายถึงการใช้ bitwise และ shift operator อย่างกว้างขวางเพื่อรับค่าข้อมูลและบรรจุลงใน payload ที่ส่ง


4
สำหรับผู้ที่สนใจในการดำเนินการบิตบูลีนและการปรับแต่งเพิ่มเติมดูที่แฮกเกอร์ดีไลท์: amazon.com/Hackers-Delight-Henry-S-Warren/dp/0201914654
gablin

7

โดยทั่วไปคุณจะใช้มันเนื่องจากข้อควรพิจารณาเกี่ยวกับขนาดและความเร็ว การใช้งาน Bitwise นั้นง่ายมากและมักจะเร็วกว่าการคำนวณทางคณิตศาสตร์ ตัวอย่างที่จะได้รับส่วนสีเขียวของค่า RGB, (rgb / 256) % 256วิธีการทางคณิตศาสตร์คือ (rgb >> 8) & 0xFFมีการดำเนินงานค่าที่เหมาะสมที่คุณจะทำสิ่งที่เป็น อันหลังนั้นเร็วกว่ามากและเมื่อคุณชินกับมันแล้วมันก็ง่ายขึ้นด้วย โดยทั่วไปการใช้งานในระดับบิตจะมีบทบาทอย่างมากเมื่อคุณต้องการเข้ารหัส / ถอดรหัสข้อมูลในขนาดกะทัดรัดและรวดเร็ว


2
BYTE g1 = (rgb / 256) % 256; 00E51013...C1 E9 08...shr ecx,8 00E51016...88 0C 24...mov byte ptr [esp],cl
rwong

4

การดำเนินการประเภทนี้มักจะใช้เมื่อเขียนสำหรับระบบฝังตัวที่หน่วยความจำหรือพลังงาน CPU ถูก จำกัด

ตัวอย่างเช่นเพื่อประหยัดพื้นที่คุณสามารถเก็บตัวแปรหลายตัวในตัวแปร int 8 บิตเดียวโดยใช้แต่ละบิตเพื่อแสดงบูลีน จากนั้นคุณต้องมีวิธีที่รวดเร็วในการตั้งค่าบิตเฉพาะหรือรับค่าบิต

โดยทั่วไปเมื่อการเขียนโปรแกรมในภาษาระดับที่สูงขึ้นเช่น C # ในเครื่องคอมพิวเตอร์ตั้งโต๊ะที่มีกิกะไบต์หน่วยความจำคุณไม่สนใจจริงๆว่าแต่ละจะขึ้นเป็นไบต์ทั้งหมดbool แต่ถ้าคุณกำลังเขียนโปรแกรมไมโครคอนโทรลเลอร์ใน C ที่มีหน่วยความจำ 2kb ทุก ๆ บิตจะนับดังนั้นความสามารถในการบรรจุ 8 bools ลงในไบต์เดียวอาจมีความสำคัญ


.NET มี[Flags]คุณสมบัติที่อนุญาตให้ใช้Enumเป็นฟิลด์บิต ตัวอย่างเช่นFontมีStyleคุณสมบัติซึ่งเป็นเขตข้อมูลบิตที่ประกอบด้วยตัวหนาตัวเอียงขีดเส้นใต้และขีดทับ
deltreme

@deltreme ใช่ฉันรู้ว่าคุณสามารถใช้ [ธง] แต่นั่นไม่ใช่ประเด็น ประเด็นก็คือในภาษาระดับสูงคุณไม่สนใจมากนักเกี่ยวกับการใช้พื้นที่สองสามไบต์สำหรับคนโง่สองสามคน โดยทั่วไปคุณสนใจเพิ่มเติมเกี่ยวกับการบำรุงรักษาและการอ่านรหัส ในระบบฝังตัวที่คุณสนใจขนาดคุณไม่สามารถเข้าถึงสิ่งต่าง ๆ เช่นแอตทริบิวต์. net [Flags] ดังนั้นคุณจึงสามารถใช้การดำเนินการระดับบิตเหล่านี้ได้
Simon P Stevens

"แต่การทดสอบว่าบิต n-th ถูกตั้งค่าไว้อย่างไรข้อได้เปรียบของสิ่งนี้คืออะไร" ดังนั้นจึงเป็นประเด็น - แต่เนื่องจากไม่มีการระบุภาษาฉันตัดสินใจที่จะใส่มันเป็นความคิดเห็นในคำตอบที่ C # ถูกกล่าวถึง มันไม่ใช่ความเห็นเกี่ยวกับคำตอบของคุณการเพิ่มหรือการรู้ดีหรืออะไรก็ตาม
deltreme

@deltreme: โอ้เยี่ยมมาก
Simon P Stevens

3

การใช้งานระดับบิตนอกจากนี้ยังใช้บ่อยในตัวแปลงสัญญาณวิดีโอและเสียงด้วยเหตุผลเดียวกับในอุปกรณ์อิเล็กทรอนิกส์แบบฝัง ความสามารถในการแพ็คห้าธงและตัวตั้งเวลาสิบเอ็ดบิตไปครึ่ง int มีประโยชน์มากเมื่อคุณต้องการสร้างตัวแปลงสัญญาณวิดีโอที่มีประสิทธิภาพสูงสุด

ในความเป็นจริง MPEG 4 ยังใช้การเข้ารหัส Golomb แบบเอ็กซ์โพเนนเชียลสำหรับฟิลด์ความยาวผันแปรได้ ค่าที่แพ็คเก็ตสุดท้ายที่มีความกว้าง 17 หรือ 19 บิตอาจจะกว้างเพียงสามหรือห้าบิตแพ็คเก็ตนี้ - และคุณจะเข้าใจสิ่งนั้นด้วยการทำงานระดับบิต


2

เคล็ดลับที่รวมการดำเนินการทางตรรกะระดับบิตการดำเนินการเปลี่ยนแปลงระดับบิตและการดำเนินการทางคณิตศาสตร์สามารถเข้าใจได้โดยผู้ที่ได้ศึกษาการสร้างตัวบวกไบนารีโดยใช้ประตูตรรกะ (และหรือหรือไม่) นอกวงกลมนั้นมันเป็นเรื่องยากที่จะเข้าใจโดยไม่มีความคิดเห็นอย่างละเอียด

มันจะมีประโยชน์เมื่อตั้งโปรแกรมหน่วยSIMDโดยเฉพาะอย่างยิ่งถ้าสถาปัตยกรรมของ CPU ตั้งใจทิ้งคำสั่ง SIMD ไว้บางส่วนเพราะสามารถเลียนแบบคำสั่งอื่นได้บ้าง

ตัวอย่างเช่นสถาปัตยกรรมอาจไม่ได้กำหนดคำแนะนำใด ๆ สำหรับการลบค่าของกลุ่ม 16 ไบต์ แต่ที่สามารถเลียนแบบโดยการปฏิเสธ bitwise แล้วเพิ่ม 1 เช่นเดียวกันการลบสามารถถูกละเว้นเช่นกันเพราะมันสามารถเลียนแบบโดยการ ลบของตัวถูกดำเนินการที่สอง ความพร้อมใช้งานของ "เส้นทางอื่น" คือเหตุผลในการข้ามคำแนะนำบางอย่าง

ในทำนองเดียวกัน SIMD อาจรองรับการเพิ่ม 8 บิตแบบขนานโดยไม่ต้องใช้การเพิ่มเติมสำหรับองค์ประกอบที่กว้างขึ้นเช่น 16 บิต 32 บิตหรือ 64 บิต ในการลอกเลียนแบบนั้นเราต้องดึงเครื่องหมายบิตออกจากผลการคำนวณ 8 บิตจากนั้นทำการดำเนินการกับองค์ประกอบถัดไป


0

ข้อมูลการบรรจุ, ops ที่เร็วกว่า (การคูณ, การหารและโมดูลัสจะเร็วขึ้นอย่างมากหากปรับให้อยู่ในระดับพลังของ 2), การพลิกบิต ฯลฯ เรียนรู้และเริ่มใช้พวกเขาและคุณจะเริ่มเห็นข้อดีมากที่สุดด้วยตนเอง


1
นั่นเป็นคำตอบที่ค่อนข้างตั้งฉาก
itsbruce
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.