กลับไปหน้าบทความ

อ่าน 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 )

ดูเพิ่มเติม

อ่านเพิ่มเติม

  • วอร์เรน, เฮนรี เอส. (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
  • อัลกอริทึมเวทมนตร์รวมจากมหาวิทยาลัยเคนตักกี้
ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Bit_manipulation&oldid=1351697396 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ การจัดการบิต

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

ศัพท์เฉพาะ

คำว่า Bit twiddling , bit fiddling , bit bashing และ bit gymnastics มักใช้แทนกันได้กับคำว่า bit manipulation แต่บางครั้งก็หมายถึงวิธีการหรือการใช้งาน bit manipulation ที่ชาญฉลาดหรือไม่ชัดเจน หรือ ภารกิจการจัดการข้อมูลควบคุมอุปกรณ์ ระดับต่ำที่...

การดำเนินการบิต

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

ตัวอย่างของการจัดการบิต

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