อ่าน 3 นาที
การจัดการบิต
การจัดการบิตคือการกระทำทางอัลกอริทึมในการจัดการบิต หรือ ข้อมูลชิ้นเล็ก ๆที่สั้นกว่าคำงานเขียนโปรแกรมคอมพิวเตอร์ที่ต้องใช้การจัดการบิต ได้แก่ การควบคุมอุปกรณ์ระดับต่ำ...
การจัดการบิต
การจัดการบิตคือการกระทำทางอัลกอริทึมในการจัดการบิต หรือ ข้อมูลชิ้นเล็ก ๆที่สั้นกว่าคำงานเขียนโปรแกรมคอมพิวเตอร์ที่ต้องใช้การจัดการบิต ได้แก่ การควบคุมอุปกรณ์ระดับต่ำ อัลกอริทึมการตรวจจับ และแก้ไขข้อผิดพลาดการบีบอัดข้อมูลอั ลกอริทึม การเข้ารหัสและการเพิ่มประสิทธิภาพสำหรับงานอื่น ๆ ส่วนใหญ่ภาษาโปรแกรม สมัยใหม่ ช่วยให้นักเขียนโปรแกรมสามารถทำงานโดยตรงกับนามธรรมแทนที่จะใช้บิตที่แทนนามธรรมเหล่านั้น
โค้ดต้นฉบับที่ทำการจัดการบิตจะใช้การดำเนินการแบบบิตไวส์เช่น AND, OR, XOR, NOT และอาจมีการดำเนินการอื่นๆ ที่คล้ายคลึงกับตัวดำเนินการบูลีน นอกจากนี้ยังมีการเลื่อนบิตและการดำเนินการเพื่อนับเลขหนึ่งและศูนย์ ค้นหาค่าหนึ่งหรือศูนย์สูงสุดและต่ำสุด ตั้งค่า รีเซ็ต และทดสอบบิต ดึงและแทรกฟิลด์ ปิดบังและกำหนดค่าศูนย์ให้กับฟิลด์ รวบรวมและกระจายบิตไปยังและจากตำแหน่งบิตหรือฟิลด์ที่กำหนด ตัวดำเนินการทางคณิตศาสตร์จำนวนเต็มยังสามารถส่งผลต่อการดำเนินการบิตร่วมกับตัวดำเนินการอื่นๆ ได้อีกด้วย
การจัดการบิตในบางกรณีสามารถขจัดหรือลดความจำเป็นในการวนซ้ำโครงสร้างข้อมูลและสามารถเพิ่มความเร็วได้หลายเท่า เนื่องจากการจัดการบิตจะถูกประมวลผลแบบขนาน อย่างไรก็ตาม หากการดำเนินการนั้นผิดปกติหรือมีต้นทุนสูงในการนำ ไปใช้ การรวมการดำเนินการนั้นก็ไม่สามารถพิสูจน์ได้ จึงเป็นแรงบันดาลใจให้เกิดการวิจัยเชิงนวัตกรรม[ 1 ]
ศัพท์เฉพาะ
คำว่า Bit twiddling , bit fiddling , bit bashingและbit gymnasticsมักใช้แทนกันได้กับคำว่า bit manipulation แต่บางครั้งก็หมายถึงวิธีการหรือการใช้งาน bit manipulation ที่ชาญฉลาดหรือไม่ชัดเจน หรือ ภารกิจการจัดการข้อมูลควบคุมอุปกรณ์ ระดับต่ำที่ น่าเบื่อหรือท้าทาย ซึ่งคำศัพท์ที่ใช้กันทั่วไปที่ถูกต้องกว่าคือbit banging
คำว่า"bit twiddling"มีที่มาจากฮาร์ดแวร์คอมพิวเตอร์ยุคแรกๆที่ผู้ใช้งานคอมพิวเตอร์จะทำการปรับแต่งโดยการหมุนหรือบิดปุ่มควบคุมต่างๆ ของคอมพิวเตอร์ เมื่อภาษาโปรแกรมคอมพิวเตอร์พัฒนาขึ้น โปรแกรมเมอร์จึงนำคำนี้มาใช้หมายถึงการจัดการข้อมูลใดๆ ที่เกี่ยวข้องกับการคำนวณ ระดับ บิต
การดำเนินการบิต
การดำเนินการแบบบิตไวส์ (Bitwise operation) ดำเนินการกับ รูปแบบบิตหรือตัวเลขไบนารีตั้งแต่หนึ่งตัวขึ้นไปในระดับบิต แต่ละตัว เป็นการดำเนินการพื้นฐานที่รวดเร็วซึ่งรองรับโดยตรงโดยหน่วยประมวลผลกลาง (CPU) และใช้ในการจัดการค่าเพื่อการเปรียบเทียบและการคำนวณ
ในโปรเซสเซอร์ส่วนใหญ่ การดำเนินการระดับบิตส่วนใหญ่ใช้เวลาเพียงรอบเดียว ซึ่งเร็วกว่าการหาร การคูณ และการกระโดดอย่างมาก ในขณะที่โปรเซสเซอร์สมัยใหม่มักจะทำการคำนวณทางคณิตศาสตร์และตรรกะบางอย่างได้เร็วพอๆ กับการดำเนินการระดับบิต เนื่องจากมีไปป์ไลน์คำสั่ง ที่ยาวขึ้น และ การออกแบบ ทางสถาปัตยกรรม อื่นๆ แต่การดำเนินการระดับบิตมักใช้พลังงานน้อยกว่าเนื่องจากการใช้ทรัพยากรที่ลดลง
ตัวอย่างของการจัดการบิต
ในการตรวจสอบว่าจำนวนใดเป็นกำลังของสองหรือไม่นั้น โดยทั่วไปเราอาจทำการหารจำนวนเต็มด้วยสองซ้ำๆ จนกว่าจำนวนนั้นจะหารด้วยสองไม่ลงตัว หากตัวประกอบที่เหลืออยู่คือ 1 แสดงว่าจำนวนเดิมเป็นกำลังของสอง นอกจากนี้ เรายังสามารถกำหนดนิพจน์ง่ายๆ โดยใช้บิตและตัวดำเนินการตรรกะ ซึ่งจะให้ค่าเป็นจริง (1) หรือเท็จ (0) ดังนี้:
bool isPowerOfTwo = ( x != 0 ) && (( x & ( x - 1 )) == 0 );ส่วนที่สองใช้ประโยชน์จากข้อเท็จจริงที่ว่าเลขยกกำลังของสองจะมีบิตที่ถูกตั้งค่าเพียงหนึ่งบิตเท่านั้นในการแสดงเลขฐานสอง:
x == 0...0 1 0...0 x-1 == 0...001...1 x & (x-1) == 0...000...0 ถ้าตัวเลขนั้นไม่ใช่ศูนย์หรือกำลังของสอง ตัวเลขนั้นจะมีเลข '1' อยู่ในหลายตำแหน่ง:
x == 0... 1 ...0 1 0...0 x-1 == 0... 1 ...001...1 x & (x-1) == 0... 1 ...000...0
หากใช้โค้ดภาษาแอสเซมบลี แบบอินไลน์ อาจมีคำสั่ง ( popcnt ) ที่นับจำนวนบิต 1 หรือ 0 ในตัวถูกดำเนินการ ตัวถูกดำเนินการที่มีบิต '1' เพียงบิตเดียวจะเป็นกำลังของ 2 อย่างไรก็ตาม คำสั่งดังกล่าวอาจมีความหน่วงมากกว่าวิธีการแบบบิตไวส์ข้างต้น
การดำเนินการจัดการบิต
โดยทั่วไปแล้ว โปรเซสเซอร์จะให้ตัวดำเนินการบิตที่มีประโยชน์เพียงบางส่วนเท่านั้น ภาษาโปรแกรมส่วนใหญ่ไม่ได้รองรับการดำเนินการบิตโดยตรง ดังนั้นจึงต้องใช้สำนวนในการเขียนโค้ด ตัวอย่างเช่น ภาษาโปรแกรม 'C' ให้เฉพาะตัวดำเนินการบิต AND (&), OR (|), XOR (^) และ NOT (~) เท่านั้น ส่วน Fortran ให้ AND (.and.), OR (.or.), XOR (.neqv.) และ EQV (.eqv.) เมื่อมีตัวดำเนินการบิตครบชุดแล้ว ตัวดำเนินการเหล่านั้นจะเป็นฟังก์ชันบูลีนที่มีตัวถูกดำเนินการสองหรือสามตัว
Algol มีฟังก์ชันการดึงและแทรกบิตฟิลด์เชิงไวยากรณ์ เมื่อภาษาโปรแกรมมีฟังก์ชันการดำเนินการบิตที่ไม่ตรงกับคำสั่งฮาร์ดแวร์โดยตรง คอมไพเลอร์จะต้องสร้างการดำเนินการนั้นขึ้นใหม่จากตัวดำเนินการที่มีอยู่
การดำเนินการบิตที่มีประโยชน์เป็นพิเศษคือการนับศูนย์นำหน้าซึ่งใช้ในการค้นหาบิตที่ตั้งค่าสูงสุดของคำเครื่อง แม้ว่าอาจจะมีชื่อที่แตกต่างกันในสถาปัตยกรรมต่างๆ[ 2 ] ไม่มีสำนวนภาษาการเขียนโปรแกรมที่ง่าย ดังนั้นจึงต้องจัดหาโดยฟังก์ชันภายในของคอมไพเลอร์หรือรูทีนไลบรารีระบบ หากไม่มีตัวดำเนินการนั้น การดำเนินการใดๆ ที่เกี่ยวข้องกับบิตสูงสุดของคำจะมีค่าใช้จ่ายสูง มาก (ดูFind first set#CLZ ) เนื่องจากการแพร่กระจายตัวทดที่ไม่สมมาตรของการดำเนินการทางคณิตศาสตร์ โชคดีที่สถาปัตยกรรม CPU ส่วนใหญ่ได้จัดเตรียมสิ่งนี้ไว้ตั้งแต่กลางทศวรรษ 1980 การดำเนินการนับหนึ่ง ที่มาพร้อมกัน หรือที่เรียกว่าPopcountซึ่งนับจำนวนบิตที่ตั้งค่าในคำเครื่อง มักจะจัดให้เป็นตัวดำเนินการฮาร์ดแวร์ด้วย
การดำเนินการบิตที่ง่ายกว่า เช่น การตั้งค่าบิต การรีเซ็ตบิต การทดสอบบิต และการสลับบิต มักจะมีให้ใช้งานในรูปแบบตัวดำเนินการฮาร์ดแวร์ แต่สามารถจำลองได้ง่ายหากไม่มีให้ใช้งาน เช่น (SET R0, 1; LSHFT R0, i; OR x, R0) จะตั้งค่าบิต i ในตัวถูกดำเนินการ x
การดำเนินการบิตที่ซับซ้อนและมีประโยชน์บางอย่างที่ต้องเขียนเป็นรหัสในภาษาโปรแกรมและให้คอมไพเลอร์สร้างขึ้น ได้แก่:
- ล้างตั้งแต่ตำแหน่งบิตที่กำหนดขึ้นไป (เว้นส่วนล่างของคำไว้)
- ล้างตั้งแต่ตำแหน่งบิตที่กำหนดลงมา (เว้นส่วนบนของคำไว้)
- หน้ากากจากบิตต่ำลงมา (ล้างคำล่าง)
- หน้ากากจากส่วนบนขึ้น (คำล่างที่ชัดเจน)
- การดึงข้อมูลบิตฟิลด์
- การแทรกบิตฟิลด์
- การดำเนินการกระจาย/รวบรวมบิตฟิลด์ (bitfield scatter/gather operations) คือการกระจายส่วนที่ต่อเนื่องกันของบิตฟิลด์ไปยังคำของเครื่อง (machine word) หรือรวบรวมบิตฟิลด์ที่แตกต่างกันในคำนั้นให้เป็นส่วนต่อเนื่องของบิตฟิลด์ (ดูตัวอย่างตัวดำเนินการ PEXT/PDEP ของ Intel รุ่นล่าสุด) ใช้ในด้านการเข้ารหัสลับและการเข้ารหัสวิดีโอ
- การผกผันเมทริกซ์
การคำนวณทางคณิตศาสตร์บางอย่างสามารถลดทอนให้เหลือเพียงการคำนวณที่ง่ายกว่าและการคำนวณระดับบิตได้:
- ลดรูปการคูณด้วยค่าคงที่ให้เป็นลำดับของการเลื่อนและบวก
ตัวอย่างเช่น การคูณด้วย 9 คือการคัดลอกตัวเลขที่ได้ถูกคูณ เลื่อนขึ้นไป 3 ตำแหน่ง (คูณด้วย 8) แล้วบวกเข้ากับตัวเลขเดิม
- ลดรูปการหารด้วยค่าคงที่ให้เป็นลำดับของการเลื่อนและลบ
การกลับบิต การกลับไบต์ และการหมุนในรูปแบบต่างๆ ล้วนอาจมีค่าใช้จ่ายสูงในแง่ของจำนวนคำสั่งที่จำเป็น การเลื่อนบิตมีหลายรูปแบบ ได้แก่ การเลื่อนบิตทางคณิตศาสตร์ การเลื่อนบิตทางตรรกะ และการหมุน
คำสั่งที่ไม่ธรรมดา ได้แก่Packed BCDซึ่งพบได้บ่อยมากในอุตสาหกรรมการเงิน การค้า และอุตสาหกรรมทั่วไป
การปิดบัง
มาสก์คือข้อมูลที่ใช้สำหรับการดำเนินการแบบบิตไวส์โดยเฉพาะในฟิลด์ บิต
การใช้มาสก์ช่วยให้สามารถตั้งค่าบิตหลายบิตในไบต์นิบเบิลเวิร์ด (เป็นต้น) ให้เป็นเปิด ปิด หรือกลับค่าจากเปิดเป็นปิด (หรือในทางกลับกัน) ได้ในการดำเนินการระดับบิตเพียงครั้งเดียว การประยุกต์ใช้มาสก์ที่ครอบคลุมมากขึ้น เมื่อนำไปใช้กับเงื่อนไขในการดำเนินการ จะเรียกว่าการทำนาย (predication )
ดูเพิ่มเติม
- การดำเนินการบิต – หัวข้อในวิทยาการคอมพิวเตอร์
- อาร์เรย์บิต
- แถบบิต
- เสียงดังปังนิดหน่อย
- บิตฟิลด์
- ชุดคำสั่งการจัดการบิต – ประเภทของคำสั่งคอมพิวเตอร์
- เงื่อนไข BIT
- ข้อกำหนดบิต (การแยกความหมาย)
- Bit twiddler (disambiguation)
- Hacker's Delight – หนังสือเกี่ยวกับอัลกอริธึมการคำนวณระดับบิตและระดับต่ำที่รวดเร็ว
- นิบเบิล — หน่วยข้อมูลที่ประกอบด้วย 4 บิต หรือครึ่งไบต์
- การทำนาย (สถาปัตยกรรมคอมพิวเตอร์)โดยใช้ "มาสก์" บิตในโปรเซสเซอร์เวกเตอร์
- การพลิกล็อกในเหตุการณ์เดียว
- SIMD ภายในรีจิสเตอร์ (SWAR)
อ่านเพิ่มเติม
- วอร์เรน, เฮนรี เอส. (2013). Hacker's Delight (ฉบับที่ 2). แอดดิสัน-เวสลีย์ โปรเฟสชันแนล. หน้า 512. ISBN 978-0321842688.
- Knuth, Donald E. (2009). ศิลปะแห่งการเขียนโปรแกรมคอมพิวเตอร์เล่ม 4 ตอนที่ 1: เทคนิคและวิธีการเกี่ยวกับบิต; แผนภาพการตัดสินใจแบบไบนารี (ฉบับพิมพ์ครั้งที่ 1). Addison–Wesley Professional. หน้า 272. ISBN 978-0321580504.( ฉบับร่างของเล่ม 1a เก็บถาวรเมื่อวันที่ 16 ตุลาคม 2019 ในWayback Machineสามารถดาวน์โหลดได้)
ลิงก์ภายนอก
- Anderson, Sean Eron, บรรณาธิการ (2009-11-26) [1997]. "Bit Twiddling Hacks"มหาวิทยาลัยสแตนฟอร์ดเก็บถาวรจากต้นฉบับเมื่อ 2020-06-01 สืบค้นเมื่อ2020-06-01
- เทคนิคการจัดการบิตพร้อมคำอธิบายและซอร์สโค้ดอย่างละเอียด
- คู่มือ Intel Intrinsics
- xchg rax, rax : ปริศนาและเทคนิคสำหรับ x86_64
- อัลกอริทึมเวทมนตร์รวมจากมหาวิทยาลัยเคนตักกี้
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ การจัดการบิต
การจัดการบิตคือการกระทำทางอัลกอริทึมในการจัดการบิต หรือ ข้อมูลชิ้นเล็ก ๆที่สั้นกว่าคำงานเขียนโปรแกรมคอมพิวเตอร์ที่ต้องใช้การจัดการบิต ได้แก่ การควบคุมอุปกรณ์ระดับต่ำ...
ศัพท์เฉพาะ
คำว่า Bit twiddling , bit fiddling , bit bashing และ bit gymnastics มักใช้แทนกันได้กับคำว่า bit manipulation แต่บางครั้งก็หมายถึงวิธีการหรือการใช้งาน bit manipulation ที่ชาญฉลาดหรือไม่ชัดเจน หรือ ภารกิจการจัดการข้อมูลควบคุมอุปกรณ์ ระดับต่ำที่...
การดำเนินการบิต
การดำเนินการแบบบิตไวส์ (Bitwise operation) ดำเนินการกับ รูปแบบบิต หรือ ตัวเลขไบนารี ตั้งแต่หนึ่งตัวขึ้นไปในระดับ บิต แต่ละตัว เป็นการดำเนินการพื้นฐานที่รวดเร็วซึ่งรองรับโดยตรงโดย หน่วยประมวลผลกลาง (CPU) และใช้ในการจัดการค่าเพื่อการเปรียบเทียบและการคำนวณ
ตัวอย่างของการจัดการบิต
ในการตรวจสอบว่าจำนวนใดเป็นกำลังของสองหรือไม่นั้น โดยทั่วไปเราอาจทำการหารจำนวนเต็มด้วยสองซ้ำๆ จนกว่าจำนวนนั้นจะหารด้วยสองไม่ลงตัว หากตัวประกอบที่เหลืออยู่คือ 1 แสดงว่าจำนวนเดิมเป็นกำลังของสอง นอกจากนี้ เรายังสามารถกำหนดนิพจน์ง่ายๆ โดยใช้บิตและตัวดำเนินการตรรกะ...