จำนวนบิตต่อตัวเลขในระบบทศนิยม [ปิด]


28

ฉันจะสอนคนกลุ่มเล็ก ๆ เกี่ยวกับระบบเลขในการคำนวณและสงสัยว่ามีกี่บิตต่อหลักในระบบทศนิยมเช่น:

  • Hex (ฐาน 16) - 4 บิต
  • Octal (ฐาน 8) - 3 บิต
  • ไบนารี (ฐาน 2) - 1 บิต
  • ทศนิยม (ฐาน 10) -?

7
ปรีชา: Let 's พูดสิ่งที่คุณแสวงหาก็คือมันครอบคลุมหนึ่งหลักทศนิยมช่วงของd บิตหมายถึงตัวเลขสามหลักทศนิยมและช่วยให้คุณเพื่อเป็นตัวแทนของจำนวนเต็มจากช่วง บิตสิบทั้งหมด (คิดว่าไบนารีตอนนี้) ให้ช่วงของ 999 อยู่ใกล้กับ 1,023 แต่น้อยกว่าเล็กน้อย ดังนั้นคุณอาจคาดหวังว่าควรน้อยกว่า 10/3 นิดหน่อย 0..93*d0..9990..1023d
Kamil Maciorowski

5
โพสต์นี้ดูเหมือนว่าจะเหมาะกับ Stack Overflow ดีกว่า Super User
gmarmstrong

21
@ gmarmstrong: ฉันจะเถียง Mathematics.SE (หรืออาจเป็น SoftwareEngineering.SE) นี่ไม่เกี่ยวข้องโดยตรงกับปัญหาการเขียนโปรแกรม
Flater

10
@Flater: คณิตศาสตร์เป็นสถานที่ที่เหมาะสมอย่างแน่นอนเนื่องจากเป็นทฤษฎีข้อมูลพื้นฐาน 101
MechMK1

7
ไม่มีความละอายในการไม่รู้เรื่องนี้ แต่คนที่ไม่อาจไม่ใช่คนที่ดีที่สุดสำหรับการสอนระบบตัวเลข
WGroleau

คำตอบ:


96

สิ่งที่คุณกำลังมองหาคือลอการิทึมแบบยึด 2 ค่าจาก 10 ซึ่งเป็นจำนวนอตรรกยะประมาณ 3.32192809489 ....

ความจริงที่ว่าคุณไม่สามารถใช้จำนวนเต็มบิตสำหรับเลขทศนิยมนั้นเป็นสาเหตุของสาเหตุที่เศษส่วนจำนวนมากที่ง่ายต่อการแสดงในระบบทศนิยม (เช่น 1/5 หรือ 0.2) เป็นไปไม่ได้ (ไม่ยาก: จริงๆ เป็นไปไม่ได้) ที่จะแสดงเป็นไบนารี่ สิ่งนี้มีความสำคัญเมื่อทำการประเมินข้อผิดพลาดในการปัดเศษในเลขทศนิยม


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
DavidPostill

20

กล่าวอีกนัยหนึ่งจำนวนข้อมูลที่มีอยู่ในระบบเลขหลักเดียว

สำหรับฐาน 2, ฐาน 4, ฐาน 8, ฐาน 16 และฐาน2 Nอื่น ๆคำตอบนั้นชัดเจนเพราะในฐาน 2 Nแต่ละหลักสามารถแสดงด้วยตัวเลข N หลักทุกประการ

คุณได้รับNอย่างไร2 N ทีนี้คุณใช้ลอการิทึม 2 ตัวซึ่งเป็นค่าผกผันของการยกกำลัง

  • log 2 2 = 1 (1 บิตต่อตัวเลขในฐาน 2)
  • log 2 4 = 2 (2 บิตต่อหลักในฐาน 4)
  • log 2 8 = 3 (3 บิตต่อหลักในฐาน 8)
  • log 2 16 = 4 (4 บิตต่อตัวเลขในฐาน 16)

ลอการิทึมที่ใช้ K สำหรับตัวเลขที่ไม่ใช่พลังของ K ไม่ใช่ตัวเลขที่สำคัญ โดยเฉพาะอย่างยิ่ง:

  • log 2 10 = 3.321928094887362347870319429489390175864831393024580612054 …

ตัวเลขนี้อาจดูสับสน แต่จริงๆแล้วมันมีประโยชน์บางอย่าง ตัวอย่างเช่นมันเป็นเอนโทรปีของตัวเลขทศนิยมเดียว

อย่างไรก็ตามสำหรับกรณีของคุณฉันไม่คิดว่าคุณค่านี้มีประโยชน์ใด ๆ @ คำตอบของคริสเตียนทำงานได้ดีในการอธิบายว่าทำไม


8

ในเรื่องของบิต:

ฉันขอโทษที่บอกว่าคำถามนี้ผิดไป คุณจะไม่ใช้บิตในลักษณะนั้น บิตเป็นเลขฐานสอง คุณสามารถแปลงเลขทศนิยม 10 ให้เป็นไบนารี 1010 (8 + 2) ดังนั้นคุณต้องใช้ 4 บิตเพื่อแสดงค่าทศนิยม 10


พลังของ 2

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


18
คำถามไม่ได้ถูกเข้าใจผิด ในเรื่องของทฤษฎีข้อมูลมันเป็นเรื่องปกติธรรมดาที่จะพูดถึงบิตในลักษณะนี้ และจากนั้นคำตอบของ Eugen Rieck ก็เป็นคำตอบที่ดี

2
ฉันขอแนะนำให้คุณพูดถึง BCD (ทศนิยมทศนิยมด้วยรหัสไบนารี) ซึ่งโดยทั่วไปจะแสดงด้วย 4 บิตในอุปกรณ์อิเล็กทรอนิกส์ ในแง่การปฏิบัติจำนวนของบิตที่ใช้เพื่อแทนเลขทศนิยมคือ 4 แต่ขึ้นอยู่กับการใช้งาน
davidmneedham

1
@DavidStockinger ถูกต้องมันขึ้นอยู่กับว่ามันเป็นคำถามเชิงทฤษฎีหรือคำถามที่นำไปปฏิบัติ
davidmneedham

2
ln (10) / ln (2) เป็นคำตอบเชิงทฤษฎี 4 bits เป็นคำตอบของการนำไปปฏิบัติ
davidmneedham

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

7

BCD - Binary Coded Decimal ใช้ 4 บิตต่อหลักเช่นเดียวกับเลขฐานสิบหก

https://en.wikipedia.org/wiki/Binary-coded_decimal


ยกเว้นว่า "BCD" มักใช้เพื่ออ้างถึงการเข้ารหัสอักขระ 6 บิต
Daniel R Hicks


@DanielRHicks อ่าโอเค Wikipedia บอกว่ามันถูกใช้ในปลายปี 1950 และ 1960 ก่อนหน้านี้ (เช่นก่อนที่จะมีการคิดค้น EBCDIC) ดังนั้นฉันจึงไม่รู้สึกละอายใจที่ไม่เคยได้ยินมาก่อน แม้ว่าตอนนี้ฉันจะรู้ว่าชื่อ EBCDIC นั้นได้มาจากมัน! อย่างไรก็ตามคำว่า BCD ยังไม่ "ใช้บ่อย" เพื่ออ้างถึงการเข้ารหัสตามที่คุณพูด
Mr Lister

3

การใช้บิตหมายถึงพลังของ 2 ดังนั้นอย่างที่คนอื่น ๆ บอกว่าคุณไม่สามารถ shohorn 10 บิตเป็นไบต์โดยไม่สูญเปล่า วิธีแก้ปัญหาทั่วไปคือการใช้ 4 บิตต่อเลขฐานสิบหกและสิ้นเปลืองสถานะ 6 สถานะที่แสดงเป็น AF สิ่งที่น่าสนใจคือการทำเลขทศนิยมด้วยวิธีนี้ - มันไม่เป็นระเบียบและเรียบง่าย

แนวคิดการสอนที่มีประโยชน์อาจเปรียบเทียบว่า Micky Mouse อาจพัฒนาระบบการนับได้อย่างไรเนื่องจากเขามีเพียง 4 นิ้วต่อมือซึ่งนำไปสู่ธรรมชาติด้วยระบบฐานแปด


ฉันเชื่อว่าคุณหมายถึง Hex ในคำตอบของคุณในฐานะ Hex ซึ่งมีค่า AF
92592

@ user92582 ใช่แล้ว การแก้ไข
davidgo

และคุณสามารถใช้ "ขยะ" 6 รัฐเพื่อเข้ารหัสจุดทศนิยมลบเทอร์มิเนเตอร์ลำดับ ฯลฯ สำหรับคณิตศาสตร์ทศนิยม ... มันไม่เรียบร้อย แต่ง่ายหรือไม่ เพียงแค่เขียนรหัสเพื่อทำสิ่งที่เราสอนเด็ก ๆ : p
Kaithar

@kaithar - ฉันไม่เชื่อว่าสิ่งที่คุณเสนอนั้นถูกต้องเนื่องจากการดำเนินการอย่างใดอย่างหนึ่งจะต้องใช้บิตเต็มหรือมากกว่า - ซึ่งคุณไม่สามารถใช้ได้
davidgo

1
ไม่มีไอเดียที่จะเกิด "10 bits" 10 bits = 1024 ค่า ตัวเลขทศนิยมมีเพียง 10 ค่าที่เป็นไปได้
MSalters

3

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

ฉันยังไม่พิจารณาเศษบิตเป็นบิตเพราะในบิตการใช้งานจริงไม่มีเศษส่วน

Q1: กี่บิตที่คุณสามารถเป็นตัวแทนในหลักทศนิยม ?

A1:คุณสามารถแสดงข้อมูล 3 บิตในหลักทศนิยมเดียว:

ชุดรูปแบบที่พบมากที่สุดจะเป็นเลขฐานสองตรงกับการตัดที่ 0 = 8 = 000 และ 1 = 9 = 001 แต่คุณสามารถใช้รูปแบบใด ๆ ที่ไม่มีสิ่งใดที่บอกว่านี่เป็นวิธีเดียวที่จะเข้ารหัสบิตเป็นตัวเลขทศนิยม

  • 0: 000
  • 1: 001
  • 2: 010
  • 3: 011
  • 4: 100
  • 5: 101
  • 6: 110
  • 7: 111
  • 8: 000 <- การห่อ (หรือไม่ได้ใช้)
  • 9: 001 <- การห่อ (หรือไม่ได้ใช้)

หรือ

Q2: ใช้เวลากี่บิตในการแทนทศนิยม

A2:คุณต้องมีอย่างน้อย 4 บิตเพื่อแสดงทศนิยมทั้งหมด กับขยะหรือห่อ

อีกรูปแบบที่พบมากที่สุดจะเป็นไบนารีตรงกับการห่อ แต่คุณสามารถใช้รูปแบบอื่น ๆ

  • 0: 0000
  • 1: 0001
  • 2: 0010
  • 3: 0011
  • 4: 0100
  • 5: 0101
  • 6: 0110
  • 7: 0111
  • 8: 1,000
  • 9: 1001
  • 0: 1010 <- การห่อ (หรือไม่ได้ใช้)
  • 1: 1011 <- การห่อ (หรือไม่ได้ใช้)
  • 2: 1100 <- การห่อ (หรือไม่ได้ใช้)
  • 3: 1101 <- การห่อ (หรือไม่ได้ใช้)
  • 4: 1110 <- การห่อ (หรือไม่ได้ใช้)
  • 5: 1111 <- การห่อ (หรือไม่ได้ใช้)

2

ในฐาน 1024 แต่ละสัญลักษณ์คือ 10 บิต ทศนิยมสามหลักมีจำนวนข้อมูลเท่ากับหนึ่งหลักในฐาน 1000 ซึ่งน้อยกว่า 1024 เล็กน้อยดังนั้นตัวเลขทศนิยมมีน้อยกว่า 10/3 บิตเล็กน้อย การประมาณนี้ให้ 3.333333 ... ในขณะที่จำนวนที่แน่นอนคือ 3.321928 ...


2
  • Hex (ฐาน 16) - 4 บิต
  • Octal (ฐาน 8) - 3 บิต
  • ไบนารี (ฐาน 2) - 1 บิต
  • ฐานสิบ (ฐาน 10) - 3 1/3 บิต
    2 10 = 1,024
    10 3 = 1,000
    2 20 = 1,048,576
    10 6 = 1,000,000
    3 หลักในฐาน 10 สูงถึง 999 สามารถเก็บได้ใน 10 บิตในฐาน 2
    6 หลักในฐาน 10 ถึง 999,999 สามารถจัดขึ้นใน 20 บิตในฐาน 2.
    นี่เป็นแนวคิดของกิโลไบต์เมกะไบต์และกิกะไบต์ที่เกิดขึ้น

จริง ๆ แล้วมันน้อยกว่า 3 1/3 เล็กน้อย ... คำตอบของคุณค่อนข้างคลุมเครือและข้อเสนอแนะที่สามารถเก็บตัวเลขได้มากถึง 999 แทนที่จะเป็นตัวเลขระหว่าง 0-1023 อาจทำให้เข้าใจผิด
wizzwizz4

0

ข้อจำกัดความรับผิดชอบ - ฉันไม่ใช่นักทฤษฎีข้อมูลเพียงรหัสลิงที่ทำงานเป็นหลักใน C และ C ++ (และด้วยประเภทความกว้างคงที่) และคำตอบของฉันจะมาจากมุมมองเฉพาะนั้น

มันต้องใช้เวลาโดยเฉลี่ย 3.2 บิตจะเป็นตัวแทนทศนิยมหลักเดียว - 0 ถึง 7 สามารถแสดงใน 3 บิตในขณะที่ 8 และ 9 ต้อง 4. 1(8*3 + 2*4)/10 == 3.2

มันมีประโยชน์น้อยกว่าที่มันฟัง สิ่งหนึ่งคุณเห็นได้ชัดว่าไม่มีเศษส่วน สำหรับอีกกรณีหนึ่งถ้าคุณใช้ชนิดจำนวนเต็มดั้งเดิม (เช่นไม่ใช่ BCD หรือ BigInt) คุณจะไม่ได้จัดเก็บค่าตามลำดับเลขทศนิยม (หรือเทียบเท่าแบบไบนารี) ประเภท 8 บิตสามารถเก็บค่าบางอย่างที่ใช้เวลาถึง 3 ตัวเลขทศนิยม แต่คุณไม่สามารถเป็นตัวแทนของทุกค่าทศนิยม 3 หลักใน 8 บิต - [0..255]ช่วงคือ คุณไม่สามารถแทนค่า[256..999]ใน 8 บิตเท่านั้น

เมื่อเราพูดถึงค่าเราจะใช้ทศนิยมหากแอปพลิเคชันคาดหวัง (เช่นแอปพลิเคชันธนาคารดิจิทัล) เมื่อเราพูดถึงบิตเรามักจะใช้เลขฐานสิบหกหรือเลขฐานสอง (ฉันแทบจะไม่เคยใช้เลขฐานแปดเพราะฉันทำงานกับระบบที่ใช้ไบต์ 8 บิตและ 32- บิตซึ่งไม่หารด้วย 3)

ค่าที่แสดงเป็นทศนิยมจะไม่จับคู่กับลำดับไบนารีอย่างหมดจด 255ใช้ค่าทศนิยม เทียบเท่าไบนารีของแต่ละหลักจะเป็น010, ,101 101แต่ฐานเป็นตัวแทนของค่าที่เป็น255 11111111ไม่มีการโต้ตอบกันระหว่างตัวเลขทศนิยมใด ๆในค่าตามลำดับเลขฐานสอง แต่มีการโต้ตอบโดยตรงกับตัวเลขฐานสิบหก - F == 1111ดังนั้นค่าสามารถแสดงเป็นเลขFFฐานสิบหก

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


  1. ที่จริงแล้วค่าเฉลี่ยต่อหลักมีขนาดเล็กกว่าตั้งแต่ 0 และ 1 เพียงต้องการบิตเดียวในขณะที่ 2 และ 3 เพียงต้องการ 2 บิต แต่ในทางปฏิบัติเราพิจารณา 0 ถึง 7 เพื่อใช้ 3 บิต เพียงทำให้ชีวิตง่ายขึ้นในหลาย ๆ วิธี


4
มันไม่ง่ายอย่างนั้น เช่นว่าการเข้ารหัส 3 หรือ 4 บิตไม่เพียงพอที่จะบอกได้ว่า1001001ควรจะเป็น หรือ91 49

@Hurkyl: อีกครั้งมุมมองของฉันใช้ประเภทจำนวนเต็มความกว้างคงที่ - 1001001แมปไปที่73( 64 + 8 + 1) ฉันไม่ได้ตีความว่ามันเป็นลำดับของเลขฐานสิบที่เข้ารหัสด้วยเลขฐานสอง ถ้ามันควรจะเป็น BCD ซึ่งจะต้องใช้ 4 บิตต่อหลักแล้วเราต้องคิดชั้นนำบิตดังนั้นจึงต้อง0 49
John Bode

2
ฉันแค่พยายามชี้ให้เห็นว่าการเข้ารหัสความยาวแปรผันนั้นไม่ง่ายอย่างที่คุณคิดไว้ คุณต้องบอกว่าสัญลักษณ์หนึ่งจบลงที่ไหนและอีกสัญลักษณ์หนึ่งเริ่มต้นขึ้น ดังนั้นคุณไม่สามารถบอกได้ว่าคุณสามารถเป็นตัวแทน 8 และ 9 กับสี่บิต 4-7 กับสาม, 2-3 กับสองและ 0-1 กับหนึ่ง และคุณสามารถเห็นได้ว่ารูปที่คุณได้รับจริงละเมิดทฤษฎีสารสนเทศผูกพันของ3.2 log(10)/log(2)

@ Hurkyl: ฉันไม่ได้พยายามทำอะไรที่เรียบง่ายและไม่ได้พูดถึงการเข้ารหัสอะไรเลย ค่าที่ใหญ่ที่สุดที่สามารถแสดงเป็นจำนวนเต็มแบบ 32 บิตคือทศนิยม 10 หลัก (3.2 บิตต่อหลัก) แต่ไม่มีการโต้ตอบระหว่างการเข้ารหัสแบบไบนารีของตัวเลขใด ๆ และการเข้ารหัสแบบไบนารีของค่า หากคุณกำลังใช้การเข้ารหัสเลขฐานสองในรูปแบบเลขฐานสิบดังนั้นความกว้างจะต้องได้รับการแก้ไขเป็น La BCD หรือคุณต้องใช้การเข้ารหัส Huffman บางประเภทซึ่งฉันไม่ได้เรียกร้อง
John Bode

1
ปัญหาของโครงร่างนี้คือคุณลืมบิตพิเศษหนึ่งบิตที่คุณต้องระบุว่าเป็นไปตาม 3 หรือ 4 บิต และด้วยความยาวเฉลี่ย 4.2 บิตต่อตัวเลขทศนิยมนี่ยิ่งแย่กว่า BCD
MSalters

0

ถ้าฉันสอนสิ่งนี้ฉันจะอธิบายก่อนว่าตัวเลขใด (แสดงเป็นชุดตัวเลขหมายถึง) กล่าวคือจากขวาไปซ้ายสมมติว่าฐาน n, a * n ^ 0 + b * n ^ 1 + c * n ^ 2 ... z * n ^ y

จากนั้นอธิบายว่า 10 ^ 3 มีค่าประมาณ 2 ^ 10 มันไม่ถูกต้องและเป็นเหตุผลในคอมพิวเตอร์เรามักไม่ทราบว่า 2k หมายถึงอะไรจริง ๆ (คือ 2,000 หรือ 2,048?) มันให้บริการค่อนข้างดีสำหรับการประมาณอย่างรวดเร็ว 2 ^ 16 ประมาณ 2 ^ (16 - 10) * 1,000 หรือ 2 ^ 6 (64) * 1,000 หรือ 64,000 ในความเป็นจริงมันคือ 65,536 แต่ถ้าคุณไม่รังเกียจที่จะออกไปประมาณร้อยละมันก็ใช้ได้ดีพอสมควรสำหรับการประมาณค่าแบบรวดเร็ว


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