มีวิธีการใช้ครึ่งบิตหรือไม่?


19

ตามที่คนส่วนใหญ่ที่นี่รู้โดยใช้ 4 บิตเราสามารถนับจาก 0 ถึง 15 (0123456789ABCDEF เป็นเลขฐานสิบหก) แต่ถ้าเรานับได้เพียง 9 เราจะยังคงใช้ 4 บิตและตัวเลขจาก A ถึง F จะสูญเปล่า

อย่างไรก็ตามหน้า QR-Code ของ Wikipediaระบุว่าการใช้เฉพาะตัวเลขที่เป็นตัวเลขตั้งแต่ 0 ถึง 9 ใช้3⅓บิตต่อตัวอักษรซึ่งถูกต้องจากจุดยืนทางสถิติ และหนึ่งในสามของบิตไม่ใช่วัตถุทางกายภาพและการส่งตัวเลขตั้งแต่ 0 ถึง 9 จะใช้ความรู้ของฉันอย่างน้อย 4 บิต

มีวิธีใดบ้างที่จะใช้ชุดค่าผสมที่สูญเปล่าเพื่อส่งอักขระอย่างมีประสิทธิภาพด้วยเศษส่วนของบิต?

ตกลงฉันขอยกตัวอย่าง: ต้องส่งสองหลัก "27" ด้วยเทคนิคการเข้ารหัสปกติบิตที่ส่งจะเป็น 00100111 จากนั้นเราสามารถจินตนาการระบบที่จะแทนที่ตัวเลข '2' ด้วย 'E' หรือ 'F' ซึ่งขึ้นอยู่กับบิตถัดไป ในกรณีนี้บิตถัดไปคือ 0 ดังนั้น '2' จึงถูกแทนที่ด้วย 'E' บิตสตริงที่ได้จะเป็น 1101 0 111 ในทางกลับกันหากต้องส่งตัวเลข "28" บิตแรกหลังจาก '2' คือ 1 ดังนั้นจะถูกแทนที่ด้วย 'F' หลักแทน ส่งผลให้สตริง 1111 1 000

ในทั้งสองกรณีการประหยัด 1 บิตได้รับผลกระทบเพราะใช้แทะหนึ่งอันสำหรับอักขระสองตัวที่แตกต่างกัน กล่าวอีกนัยหนึ่งสามและครึ่งบิตใช้อักขระแต่ละตัว


2
สำหรับมุมมองที่แตกต่างกันเกี่ยวกับค่าการบรรจุในพื้นที่ที่เล็กกว่านั้นลองดูคอมพิวเตอร์ Ternary ( en.wikipedia.org/wiki/Ternary_computer ) ถ้ามันดีพอสำหรับ Knuth มันก็ดีพอสำหรับฉัน!
RLH

3
ยังดีกว่าที่จะรับรู้ว่าคุณสามารถคำนวณ(10 * first_digit) + second_digitและเข้ารหัสที่เป็น 7 บิตคิดเป็น 0 ... 99 ด้วยรหัส 100-127 ที่เหลือสำหรับสิ่งอื่น ๆ และยังประหยัดได้มากขึ้นด้วยการบีบอัด 3 หลักเป็น 10 บิต
Hot Licks

ในการส่งค่าที่แตกต่างกัน 100 ค่าแยกกันสิ่งที่ดีที่สุดที่คุณจะได้รับคือการบรรจุเป็น 7 บิต หากคุณมีตัวเลขมากขึ้นการบรรจุจะมีประสิทธิภาพมากขึ้น หากคุณมีค่าน้อยกว่า 64 ค่าที่จะส่งคุณสามารถส่งได้โดยใช้เพียง 6 บิต
phuclv

คำตอบ:


22

คุณไม่สามารถส่งครึ่งบิตได้ แต่คุณสามารถแพ็คสองบิตได้อย่างมีประสิทธิภาพในหนึ่งบิตก่อนการส่งหรือการจัดเก็บ

คุณให้ตัวอย่างด้วยตัวคุณเองดังนั้นคุณจึงตอบคำถามของคุณด้วย YES ได้อย่างมีประสิทธิภาพ

วิธีที่ค่อนข้างง่ายกว่าคือการเข้ารหัสค่าทศนิยมสองหลักใน 7 บิต (เรียงลำดับของเลขฐานสองไบนารีทศนิยม)


1
กรณีการใช้งานที่ดีอย่างหนึ่งสำหรับการบรรจุคู่ของตัวเลขลงในเจ็ดบิตคือเมื่อส่งไฟล์ ASCII ที่ประกอบด้วยข้อมูลที่เป็นตัวเลขส่วนใหญ่ ค่าไบต์ใด ๆ ที่ต่ำกว่า 128 แสดงถึงอักขระ ASCII เดียวในขณะที่ 128-227 แทนสองหลัก ASCII ง่ายในการเข้ารหัสหรือถอดรหัสและไม่ต้องการข้อมูลนั้นส่วนใหญ่ประกอบด้วยตัวเลข (หรือแม้แต่ตัวเลขใด ๆ ) แต่สามารถบีบอัดสตริงของตัวเลขได้ 50% อย่างง่ายดาย
supercat

หรือว่ารูปแบบ PDP11 ที่บรรจุ 3 ตัวอักษรและตัวเลขเป็น 16 บิตกับหนึ่งบิตอะไหล่ ...
ไบรอันดรัมมอนด์

@BrianDrummond: หนึ่งสามารถใช้ 16 บิตในการจัดเก็บตัวละครสามตัวจากชุดของ 40 หรือถึงสามจากชุด 39 แต่จะไม่มีบิตอะไหล่ ปกติ "และตัวเลข" จะบ่งบอกถึงชุดของอย่างน้อย 36 แต่วิธีเดียวที่จะมีบิตอะไหล่จะเป็นถ้าชุดที่ถูก จำกัด 32
SuperCat

ฉันคิดว่ามันคือ 5 บิต / ตัวอักษร ตัวอักษรและตัวเลขแบ่งออกเป็นสองชุดรหัสโดยมีสัญลักษณ์หนึ่งอันสงวนไว้สำหรับ "ชุดรหัสสวิตช์" ฉันผิด: en.wikipedia.org/wiki/DEC_Radix-50ประหลาดมากพอเห็นแค่คืนเดียวเมื่อฉันต้องถอดรหัสรายงานที่มีคนให้ฉันในฟลอปปี้ขนาด 8 "บนระบบ CP / M โดยมีเพียงสลัว ความทรงจำของ Z80 asm.
Brian Drummond

19

คุณสามารถใช้การเข้ารหัส huffman เพื่อให้ตัวเลขมีความยาวบิตที่แตกต่างกัน หากคุณตระหนักถึงตัวเลขที่จะเกิดขึ้นบ่อยกว่าเลขอื่นมันจะช่วยได้

ตัวอย่าง (มีเหตุการณ์เท่ากัน):

0 - 1111

1 - 1110

2 - 110

3 - 101

4 - 100

5 - 011

6 - 010

7 - 001

8 - 000

ตัวอย่างที่ได้รับสำหรับการรับหมายเลข 1:

บิตแรกเข้ามาและปล่อยให้ตัวเลือกเป็น 0 ถึง 4 เท่านั้น

บิตที่สองจะเข้ามาและออกจากตัวเลือกเพียง 0 ถึง 2

บิตที่สามเข้ามาและปล่อยให้ 0 ถึง 1 เป็นตัวเลือก

บิตที่สี่เข้ามาและหมายเลขที่เข้ามาคือ 1


12

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

การอ้างถึงWikipedia :

การเข้ารหัสเลขคณิตแตกต่างจากการเข้ารหัสเอนโทรปีในรูปแบบอื่น ๆ เช่นการเข้ารหัส Huffman แทนที่จะแยกอินพุตเป็นสัญลักษณ์ส่วนประกอบและแทนที่แต่ละส่วนด้วยรหัสการเข้ารหัสทางเลขคณิตเข้ารหัสข้อความทั้งหมดเป็นตัวเลขเดียวเศษที่ n (0.0 ≤ n < 1.0)


10

IEEE P754 ใหม่สำหรับเลขทศนิยมนี้กำหนดรูปแบบทศนิยมนอกเหนือจากไบนารี การเข้ารหัสอย่างใดอย่างหนึ่งเสนอให้จัดกลุ่มตัวเลขดิจิตัล 3 เป็น 10 บิต

การเข้ารหัส 0 ถึง 999 โดยใช้ 10bits = 1024 รหัสที่เป็นไปได้ค่อนข้างมีประสิทธิภาพและตัวเลขทศนิยมมักจะถูกจัดกลุ่มด้วยสามอย่างไรก็ตาม

ทศนิยมแบบหนาแน่น : http://en.wikipedia.org/wiki/Densely_packed_decimal


แม้ว่าตัวเลขทศนิยมจะถูกจัดกลุ่มด้วยสามความหมายทศนิยมทศนิยมถูกต้องอาจต้องว่า (1) การปรับ mantissa โดยอำนาจที่ไม่ใช่หลายหลายในสามของสิบ entails คูณหรือหารองค์ประกอบทั้งหมดโดย 10 หรือ 100; (2) บิตบางส่วนสามารถใช้สำหรับส่วนบนหรือล่างของตัวเลขขึ้นอยู่กับ (เลขชี้กำลัง 3) (3) หากเลขชี้กำลังถูกเก็บไว้ที่ base-1000 กลุ่มของตัวเลขสามหลักด้านล่างอาจจะถูกปัดเศษเป็น 10 หรือ 100 ที่ใกล้ที่สุดแทนที่จะเป็นหน่วยที่ใกล้ที่สุด
supercat

ฉันเองเชื่อว่าประเภทที่ต้องการBigDecimalเพื่อวัตถุประสงค์หลายอย่างจะมีประสิทธิภาพมากขึ้นถ้าแต่ละคำมีทศนิยม 9 หลักแทนที่จะเป็น 32 บิต แต่พฤติกรรมการปัดเศษไม่ควรได้รับผลกระทบจากการจัดกลุ่มหลัก
supercat

4

การโต้ตอบ 1: 1 ของไบนารี (หรือเลขฐานสิบหก) เป็นเพียงสัญลักษณ์เดียวที่เข้ารหัสสำหรับบิต ใช่แล้วอย่างที่คุณแสดงว่าเป็นไปได้ สถานที่นี้ใช้อีก (แต่แตกต่างกันเล็กน้อย) ในการเข้ารหัส / ถอดรหัสในระบบการสื่อสารโครงสร้างบังตาที่ช่องทางที่การเปลี่ยนบิตจะถูกเก็บไว้ห่างกันเพื่อความสะดวกในการถอดรหัส และแน่นอนว่า 8b / 10b และ 64b / 66b เป็นต้นการเข้ารหัสเป็นความคิดที่คล้ายกันซึ่งการเข้ารหัสพื้นที่สัญลักษณ์ขนาดเล็กในพื้นที่ขนาดใหญ่ซ้ำซ้อนเล็กน้อยเพื่อรับสมดุล DC การแยกสัญลักษณ์และรหัสควบคุมในวงย่อย


4

การแสดงข้อมูลขึ้นอยู่กับการตีความที่คุณหรือโปรแกรมของคุณมอบให้

ตัวอย่างเช่นเราสามารถส่ง '27' เป็นอักขระ ASCII ได้เช่น0x3237 = 0b0011001000110111กัน

xn(x) ค่าที่เป็นไปได้ที่แตกต่างกันคุณจะต้อง เข้าสู่ระบบ2n(x) เกร็ด

ทีนี้สมมติว่าคุณมีตัวแปรสองตัว x1,x2 กับ n(x1),n(x2)ค่าที่เป็นไปได้ หากคุณจัดเก็บแยกต่างหากคุณจะต้องเข้าสู่ระบบ2n(x1)+เข้าสู่ระบบ2n(x2)เกร็ด อย่างไรก็ตามหากคุณเก็บมันไว้ด้วยกันคุณจะต้องการเท่านั้นเข้าสู่ระบบ2(n(x1)n(x2)) เกร็ด

ในตัวอย่างของคุณที่มีการส่งตัวเลขสองหลักทั้งสองหลักสามารถมี 10 ค่าที่แตกต่างกัน หากคุณจัดเก็บแยกต่างหากคุณต้องการ2เข้าสู่ระบบ2(10)=24=8เกร็ด ถ้าคุณเก็บมันไว้ด้วยกันคุณก็ต้องการเข้าสู่ระบบ2(1010)=7 เกร็ด

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


บันทึก: ...เป็นสัญกรณ์สำหรับปัดเศษขึ้น


2

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

หากคุณมี 5 ค่าในช่วง 0 ถึง 2 คุณสามารถแทนค่านั้นได้ใน 8 บิต (คุณต้องการอย่างน้อย 7.92 บิตเพื่อแทนค่า) แทนที่จะเป็น 10 บิตที่ใช้โดยวิธีไร้เดียงสาของการใช้ 2 บิตสำหรับแต่ละค่า โดยทำ (((n 1 * 3 + n 2 ) * 3 + n 3 ) * 3 + n 4 ) * 3 + n 5


มีชื่อสำหรับวิธีการเข้ารหัสนี้หรือไม่?
คีแกนเจย์

1

ในทางทฤษฎีหากคุณเต็มใจที่จะใช้พื้นที่วงจรและพลังงานสำหรับเครื่องตรวจจับความต้านทานสูงคุณสามารถส่ง 3 สถานะลงมาในสายดิจิตอล (1, 0 และสูง -Z) คำเตือน: มันใช้งานได้ดีในการจำลอง ฉันไม่ทราบว่าวงจรมีปัญหาบางอย่างที่ทำให้ไม่สามารถใช้งานได้หรือไม่เช่นบอกว่ามันไม่สามารถสลับได้เร็วเท่ากับประตูคู่ปกติ

ศัพท์ปกติของฉันสำหรับการเปลี่ยนสัญญาณจาก high-Z เป็นสัญญาณ (โดยปกติสัญญาณจะเป็นกราวด์ในซิลิคอน) เป็นสัญญาณครึ่งบิต


1

คุณต้องการส่งทศนิยมหนึ่งหลักต้องการ3⅓บิต แต่คุณจะต้องใช้ 4 บิตเพราะคุณไม่สามารถส่งหนึ่งในสามของบิต

ดังนั้นเพื่อค้นหาว่า3⅓บิตหมายถึงอะไรจริงๆคุณต้องมีสอง (หรือสาม) หลักของ3⅓บิตแต่ละ ถ้าคุณต้องการส่งทศนิยม 2 (3) หลักระหว่าง 0 ถึง 9 แต่ละต้องการน้อยกว่า3⅓บิตเล็กน้อยคุณสามารถทำได้โดยใช้บิต 7 (10) การสร้างที่พิสูจน์ได้ง่าย:

7 (10) บิตช่วยให้คุณสามารถเข้ารหัสตัวเลขระหว่าง 0 ถึง 128 (1023) - แต่คุณจะต้อง 00 (000) ถึง 99 (999) ซึ่งเป็นการเข้ารหัสที่เป็นไปได้ทั้งหมดของตัวเลขทศนิยมสอง (สาม) หลัก QED


1

ฉันคิดว่าคุณเข้าใจผิดว่าอะไรมีความหมายในบทความวิกิที่เชื่อมโยง อะไรคือความหมายเป็นที่สำหรับสตริงอักขระที่เป็นตัวเลขอย่างสมบูรณ์ (ไม่มีช่องว่างจุลภาคหรือรอบระยะเวลา) ใช้การบีบอัดที่เหมาะที่คุณสามารถเป็นตัวแทนของตัวละครโดยใช้ 3 แต่ละ1 / 3บิตโดยเฉลี่ย ที่จริงแล้วมันค่อนข้างดีกว่านี้เนื่องจากคณิตศาสตร์บอกว่าคุณจะได้รับ log 2 (10) = 3.3219 bits / ตัวอักษรในระยะยาว

ในทำนองเดียวกันสำหรับชุดของตัวอักษรและตัวเลขรวมถึงสัญลักษณ์บางอย่าง (ตัวพิมพ์ใหญ่เท่านั้นและ 9 สัญลักษณ์) หรือ 45 ตัวอักษรคุณต้องเข้าสู่ระบบ2 (45) = 5.4918 บิต / ตัวอักษรซึ่งถูกปัดเศษเป็น 5.5 ในบทความ

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

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