เหตุใดจึงต้องใช้หมายเลขฐานอื่น ๆ เมื่อตั้งโปรแกรม


35

เพื่อนร่วมงานของฉันและฉันกำลังคิดในใจของเราที่จะหาสาเหตุที่ทุกคนจะออกไปทางหมายเลขโปรแกรมในฐานอื่นที่ไม่ใช่ฐาน 10

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

ความคิดใด ๆ


6
คุณมีตัวอย่างเฉพาะที่ทำให้เกิดคำถามนี้หรือไม่? สิ่งที่อยู่ใน base-2 หรือ base-16 นั้นมีประโยชน์เพราะมันง่ายสำหรับคอมพิวเตอร์ที่จะเข้าใจ
KDiTraglia

4
"ตัวเลขการเขียนโปรแกรมในฐาน ... " ควรจะหมายถึงอะไร มีตัวเลข ระยะเวลา มันมีการแสดงภายในบางส่วน แต่ส่วนใหญ่ไม่สำคัญและไม่เปลี่ยนแปลงกฎเลขคณิตใด ๆ

12
@JMD - โปรดทำงานร่วมกับผู้ดูแลเพื่อลบการโพสต์ข้ามสองรายการจากนั้นโพสต์ลงใน P.SE การข้ามโพสต์ข้ามไซต์ถูกทำให้ขมวดคิ้ว mods สามารถโยกย้ายคำถามสำหรับคุณแทน

10
@JMD - การโพสต์ข้ามยังคงไม่ใช่สิ่งที่คุณควรทำ มีการโยกย้ายสำหรับคำถามดังกล่าวคือถ้าจำเป็น
Oded

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

คำตอบ:


59

เหตุผลปกติในการเขียนตัวเลขในรหัสนอกเหนือจากฐาน 10 เป็นเพราะคุณเป็นคนขี้เล่น

ในการเลือกตัวอย่างใน C (เพราะถ้า C เป็นสิ่งที่ดีสำหรับทุกอย่างมันดีสำหรับ bit-twiddling) พูดในรูปแบบ low-level encodes 2-bit และ 6-bit number ใน byte xx yyyyyy:

main() {
    unsigned char codevalue = 0x94; // 10 010100
    printf("x=%d, y=%d\n", (codevalue & 0xc0) >> 6, (codevalue & 0x3f));
}

ผลิต

x=2, y=20

ในสถานการณ์เช่นนี้การเขียนค่าคงที่ในฐานสิบหกนั้นมีความสับสนน้อยกว่าการเขียนในหน่วยทศนิยมเพราะเลขฐานสิบหกหนึ่งตัวมีความสอดคล้องกับสี่บิต (ครึ่งไบต์; หนึ่ง 'ตอด') และสองต่อหนึ่งไบต์: ตัวเลข0x3fมีบิตทั้งหมด ตั้งอยู่ในแทะเล็มต่ำและสองบิตตั้งอยู่ในแทะสูง

คุณสามารถเขียนบรรทัดที่สองนั้นในฐานแปด:

printf("x=%d, y=%d\n", (codevalue & 0300) >> 6, (codevalue & 077));

ที่นี่แต่ละหลักตรงกับบล็อกของสามบิต บางคนคิดว่าคิดง่ายกว่า แต่ฉันคิดว่าวันนี้ค่อนข้างหายาก


อีกตัวอย่างหนึ่งคือการใช้ "หมายเลขมายากล" 0xDEADBEEF ดูโพสต์นี้stackoverflow.com/questions/5907614/0xdeadbeef-vs-null
Etsitpab Nioliv

45

เหตุผลหลักที่ฉันใช้ฐานที่แตกต่างกันคือเมื่อฉันสนใจบิต

อ่านง่ายกว่ามาก

int mask=0xFF;
byte bottom_byte = value & mask;

กว่า

int mask=255;
byte bottom_byte = value & mask;

หรือภาพสิ่งที่ซับซ้อนมากขึ้น

int mask=0xFF00FF00;
int top_bytes_by_word = value & mask;

เปรียบเทียบกับ

int mask=4278255360; //can you say magic number!? 
int top_bytes_by_word = value & mask;

มันชัดเจนมากที่นี่สิ่งที่เจตนามีอยู่ในตัวอย่างฐานสิบหกเพราะฐานสิบหกเป็นเพียงรูปแบบที่กะทัดรัดกว่าของไบนารี ... ในทางตรงกันข้ามฐาน -10 (สิ่งที่เราใช้) ไม่ได้แมปเกือบเป็นฐานสอง

0xFF = b11111111 = 255
0xFFFF = b1111111111111111 = 65536
0xF0F0 = b1111000011110000 = 61680

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


2
Octal ไม่หายากเลย 0 คือ Octal :) (เห็นว่ามีบางแห่งในเครือข่าย Stack Exchange ไม่พบเลยตอนนี้)
gerrit

2
@Earlz: คนที่มีนิ้วเยอะ :-)
Bryan Oakley

3
26 x 2 + 10 = อักษรตัวใหญ่และตัวพิมพ์เล็กและตัวเลขทั้งหมด ไม่ผิดปกติจริงๆ ฉันเคยเห็น Base 36 ที่ใช้แล้วซึ่งเป็นรุ่นที่ไม่ต้องตรงตามตัวพิมพ์ใหญ่ - เล็ก
Darrel Hoffman

3
@vasile: มี 60 นาทีในหนึ่งชั่วโมงและ 60 วินาทีในหนึ่งนาทีเพราะคนใช้ระบบฐาน -60 ไม่ใช่วิธีอื่น ๆ ฉันหวังว่าคุณจะไม่เชื่อว่ามีบางสิ่งในธรรมชาติที่บอกว่าจะต้องมี 60 นาทีในหนึ่งชั่วโมง!
Joren

1
ใช่พวกเขาอ่านมันในดวงดาวและพวกเขาใช้เบส -60 เพราะการวัดเวลา ด้วย 360 วัน (= 6x60) ต่อปีมันไม่บ้าที่จะวัดเวลาในฐาน -60
ytg

8

อย่างที่คุณอาจทราบคอมพิวเตอร์ตั้งอยู่บนฐานสอง - นี่คือฐาน 2

มันง่ายที่จะแปลงระหว่างฐาน 2 และ 4, 8 และ 16 (และทวีคูณที่คล้ายกัน 2) และการเก็บการแปลนี้ในซอร์สโค้ดสามารถทำให้การทำงานกับตัวเลขง่ายขึ้นมากสำหรับเหตุผล

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

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

หากคุณต้องการที่จะเรียนรู้มากขึ้นผมขอแนะนำให้อ่านรหัสโดย Charles Petzold


3
คอมไพเลอร์ไม่ได้ให้คำด่า ในขณะที่การแปลงระหว่างฐานที่คุณอยู่นั้นง่ายกว่าแน่นอนการแปลงอย่างง่าย (ช้า - ช้า) สำหรับฐาน 10 นั้นไม่ยากเช่นกันและภาษาส่วนใหญ่มีประโยชน์สำหรับการสร้างคอมไพเลอร์ (คุณไม่ได้ใช้ชุดประกอบ) การแปลงที่มีอยู่ในไลบรารีมาตรฐานของพวกเขาดังนั้นมันจึงฟรีสำหรับคอมไพเลอร์

1
การใช้เลขฐานสิบหกใน C ไม่ได้แปลโปรแกรมที่เร็วขึ้น คอมไพเลอร์ไม่สนใจฐานที่คุณใช้
Charles Salvia

5
ไม่ว่าจะเขียนโปรแกรมพื้นฐานใดคอมไพเลอร์แปลมันเป็นไบนารี่ ณ เวลาคอมไพล์ คำแนะนำการประกอบเหมือนกัน
Karl Bielefeldt

2
ในความเป็นจริงแล้วคอมพิวเตอร์ขององค์กรนั้นใช้บูลสามรุ่น: จริงเท็จและ "ไม่พบไฟล์"
Martin Beckett


4

นอกเหนือจากโปรแกรมที่มีความเชี่ยวชาญสูงมันค่อนข้างยากที่จะใช้ฐานอื่นที่ไม่ใช่ 10, 16 หรือ 2

ฐาน 16 (ฐานสิบหก) มีประโยชน์เพียงเพราะช่วงเต็มของไบต์ (0-255) สามารถแสดงเป็นตัวเลขสองหลัก (0x00-0xFF) ซึ่งสามารถทำให้การทำงานกับฐานสิบหกดิบหรือข้อมูลไบนารีง่ายขึ้นมาก เลขฐานสิบหกยังมีประโยชน์เมื่อใช้บิตมาสก์กับตัวดำเนินการ bitwise เนื่องจากตัวเลขสองหลักไปยังการติดต่อแบบไบต์ช่วยให้สามารถอ่านได้

ยิ่งไปกว่านั้นฐาน 2 (ไบนารี) ยังสามารถใช้กับการดำเนินงานระดับบิตได้ แต่ภาษาการเขียนโปรแกรมจำนวนมากไม่รองรับตัวอักษรฐาน -2 และยิ่งกว่านั้นเลขฐานสิบหกก็ยิ่งกระชับและอ่านได้ง่ายขึ้น

บางครั้งใช้ Base-8 (octal) เนื่องจากสิทธิ์ของไฟล์ UNIX นอกจากนั้นมันค่อนข้างยากที่จะใช้ฐานอื่นนอกเหนือจาก 10 นอกบริบททางคณิตศาสตร์ที่มีความเชี่ยวชาญสูง


Octal มักใช้เพื่อระบุค่าอักขระและบางครั้งเพื่อดัมพ์ข้อมูลไบนารี
Caleb

3

เหตุผลที่ถูกต้องที่ใช้กันมากที่สุดในการใช้เบสอื่นนั้นเกี่ยวข้องกับความง่ายในการแปลงเป็นเบสที่ 2: มันเป็นเรื่องเล็กน้อยที่จะแปลงเบส -8 หรือเลขฐาน 16 ให้เป็นเลขฐานสองโดยไม่ต้องใช้เครื่องคิดเลขโดยการจำตารางสั้น ๆ หมายเลข:

 0000 0     0001 1     0010 2     0011 3
 0100 4     0101 5     0110 6     0111 7

 1000 8     1001 9     1010 A     1011 B
 1100 C     1101 D     1110 E     1111 F

สิ่งนี้เปิดขึ้นได้หลายทาง:

  • เมื่อตัวเลขแสดงองค์ประกอบของเลขฐานสองที่มีความหมายคุณสามารถกำหนดส่วนประกอบแต่ละตัวได้โดยไม่ต้องใช้คอมพิวเตอร์ ตัวอย่างเช่นถ้าตัวเลข 24- บิตแทนสีใน RGB มันไม่สำคัญที่จะบอกว่า0xFF00FFเป็นสีม่วงแดง (น้ำเงิน + แดง) งานนั้นยากกว่ามากเมื่อคุณได้รับการนำเสนอด้วย16711935
  • เมื่อตัวเลขแสดงถึงรูปแบบบิตมันเป็นประโยชน์มากกว่าที่จะเขียนลงในรูปของเลขฐานสิบหกที่มีขนาดกะทัดรัดแทนที่จะเป็นเลขฐานสองที่ยาวกว่ามาก
  • สถาปัตยกรรมบางอย่างออกไปเพื่อให้ง่ายต่อการอ่านรหัสเลขฐานแปดเมื่อพิมพ์เป็นเลขฐานแปด PDP-11 เป็นหนึ่งในระบบดังกล่าวบิตที่สำคัญที่สุดจะช่วยให้คุณสามารถบอกการดำเนินงาน 8 บิตจากบิตที่ 16 บิต กลุ่มแปดแปดกลุ่มสุดท้ายจะช่วยให้คุณบอกผู้ลงทะเบียนทั้งสองที่เกี่ยวข้องในการดำเนินการและอื่น ๆ ฉันรู้ว่าหลายคนที่สามารถอ่านรหัสไบนารี PDP-11 ออกจากหน้าจอได้โดยไม่ต้องถอดแยกชิ้นส่วน แต่พวกเขาต้องการรหัสเครื่องที่จะพิมพ์ในระบบฐานแปด

2

คอมพิวเตอร์ (หรือคอมไพเลอร์ที่ถูกต้องมากกว่านี้) ไม่ได้สนใจว่าคุณจะใช้ฐานหมายเลขใดในซอร์สโค้ดของคุณ ภาษาโปรแกรมที่ใช้กันมากที่สุดรองรับฐาน 8 (ฐานแปด), 10 (ฐานสิบ) และ 16 (ฐานสิบหก) โดยตรง บางคนยังสนับสนุนกีฬาโดยตรงสำหรับหมายเลขฐาน 2 (ไบนารี) ภาษาเฉพาะอาจรองรับฐานจำนวนอื่นเช่นกัน (โดย "สนับสนุนโดยตรง" ฉันหมายความว่าพวกเขาอนุญาตให้ป้อนตัวเลขในฐานนั้นโดยไม่ต้องใช้เทคนิคทางคณิตศาสตร์เช่นการเลื่อนบิตการคูณการหาร ฯลฯ ในซอร์สโค้ดเองตัวอย่างเช่น C สนับสนุนฐานโดยตรงกับ -160xหมายเลขนำหน้าและชุดเลขฐานสิบหกหลักปกติคือ 0123456789ABCDEF ทีนี้เทคนิคดังกล่าวอาจเป็นประโยชน์ในการทำให้ตัวเลขเข้าใจได้ง่ายขึ้นในบริบท แต่ตราบใดที่คุณสามารถแสดงหมายเลขเดิมโดยที่ไม่ต้องทำสิ่งเหล่านี้การทำเช่นนั้นหรือไม่นั้นเป็นเพียงความสะดวกสบายเท่านั้น)

อย่างไรก็ตามในท้ายที่สุดนั่นเป็นเรื่องไม่สำคัญ สมมติว่าคุณมีคำสั่งดังนี้:

int n = 10;

จุดประสงค์คือการสร้างตัวแปรจำนวนเต็มและกำหนดค่าเริ่มต้นด้วยตัวเลขทศนิยม 10 คอมพิวเตอร์เห็นอะไร

i  n  t     n     =     1  0  ;
69 6e 74 20 6e 20 3d 20 31 30 3b (ASCII, hex)

คอมไพเลอร์จะทำเครื่องหมายสิ่งนี้และตระหนักว่าคุณกำลังประกาศตัวแปรประเภทintด้วยชื่อnและกำหนดค่าเริ่มต้นบางอย่าง แต่คุณค่านั้นคืออะไร?

0x31 0x30ไปยังเครื่องคอมพิวเตอร์และละเว้นการสั่งซื้อไบต์และปัญหาการจัดตำแหน่งการป้อนข้อมูลสำหรับตัวแปรเป็นค่าเริ่มต้นคือ นี่หมายความว่าค่าเริ่มต้นคือ 0x3130 (12592 ในฐาน 10) หรือไม่ ไม่แน่นอน ตัวแยกวิเคราะห์ภาษาต้องอ่านไฟล์ต่อไปในการเข้ารหัสอักขระที่ใช้ดังนั้นจึงอ่าน1 0ตามด้วยตัวยุติคำสั่ง เนื่องจากสันนิษฐานว่าเป็นฐานภาษา 10 การอ่านนี้ (ย้อนหลัง) จึงเป็น "0 รายการ 1 หมื่นสิ้นสุด" นั่นคือค่า 10 ทศนิยม

หากเราระบุค่าเป็นเลขฐานสิบหกและภาษาของเราใช้0xเพื่อระบุว่าค่าต่อไปนี้เป็นเลขฐานสิบหกเราจะได้รับดังต่อไปนี้:

i  n  t     n     =     0  x  1  0  ;
69 6e 74 20 6e 20 3d 20 30 78 31 30 3b (ASCII, hex)

คอมไพเลอร์เห็น0x(0x30 0x78) และรับรู้ว่าเป็นคำนำหน้าฐาน 16 ดังนั้นจึงมองหาหมายเลขฐาน 16 ที่ถูกต้องตามหลังมัน 10จนกระทั่งท้ายคำสั่งที่จะอ่าน สิ่งนี้แปลเป็น 0 "คน", 1 "sixteens" ซึ่งทำงานได้ถึง 16 ในฐาน 10 หรือ 00010000 ในฐาน 2 หรืออื่น ๆ ที่คุณต้องการเป็นตัวแทน

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

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

บรรทัดล่าง: ไม่ต้องกังวลกับมัน เขียนตัวเลขในฐานที่ภาษาการเขียนโปรแกรมที่คุณเลือกรองรับและเหมาะสมสำหรับการใช้และ / หรืออ่านตัวเลข คุณใช้เวลาอ่านคำตอบนี้นานกว่าที่คุณจะกู้คืนได้ในการรวบรวมโดยฉลาดเกี่ยวกับฐานหมายเลขที่จะใช้ในซอร์สโค้ด ;)


1

ทำไมทุกคนจะออกไปหาตัวเลขในฐานอื่นที่ไม่ใช่ฐาน 10

นี่คือสาเหตุบางประการที่ไม่ปรากฏขึ้น ...

x00 - API ของ OS และอุปกรณ์ฮาร์ดแวร์บางตัวคาดว่าอาร์กิวเมนต์จะเป็นเลขฐานสิบหก / ไบนารี เมื่อคุณใช้รหัสสำหรับ API ดังกล่าวจะเป็นการง่ายกว่าที่จะใช้ตัวเลขในรูปแบบเดียวกับที่ API คาดว่าจะเป็นแทนที่จะทำการแปลงระหว่างฐานที่ต่างกัน ตัวอย่างเช่นในการส่งข้อความสิ้นสุดไบต์ไปยังเซิร์ฟเวอร์หรือส่งข้อความเพื่อปิดการเชื่อมต่อไปยังช่องทางการสื่อสาร

x01 - คุณอาจต้องการให้แอปพลิเคชันของคุณแสดงอักขระที่ไม่มีให้บริการในแป้นพิมพ์บางตัวเช่นเครื่องหมายลิขสิทธิ์ (\ u00a9)

x02 - เพื่อให้ค่าคงที่ / ตัวอักษรบางค่าคงอยู่ (มองเห็น) ผ่านการตั้งค่าวัฒนธรรมที่แตกต่างกันโดยเฉพาะอย่างยิ่งเมื่อซอร์สโค้ด / ไฟล์ถูกย้ายข้ามนักพัฒนาที่มีการตั้งค่าท้องถิ่นที่แตกต่างกัน

x03 - เพื่อทำให้โค้ดดูสับสนและซับซ้อน - ข้อดีคือ C # ไม่สนับสนุนค่าคงที่ฐานแปด!


1

ปัญหาสำคัญคือการแสดงคำเดียวขนาดคอมพิวเตอร์ในวิธีที่เหมาะสม 6502 เป็นตัวประมวลผล 8 บิต 4004 เป็นตัวประมวลผล 4 บิต

เมื่อจัดการกับตัวเลข 4 หรือ 8 บิตทำงานได้ดี ตัวเลข 4 บิตเป็นอักขระเลขฐานสิบหกเดียว หมายเลข 8 บิต (ไบต์) เป็นเลขฐานสิบหกสองหลัก ระบบที่มีพลังขนาด 2 คำเป็นมาตรฐานที่เห็นกันทั่วไปในวันนี้ - 16 บิต, 32 บิต, 64 บิต สิ่งเหล่านี้หารด้วย 4 เป็นอย่างดีสำหรับการแทนด้วยเลขฐานสิบหก

Octal (ฐาน 8) ถูกใช้ในระบบที่ขนาดคำคือ 12, 24, หรือ 36 PDP8, เมนเฟรมของไอบีเอ็มและ ICL 1900 ของวันที่เก่าใช้เหล่านี้ คำเหล่านี้แสดงได้ง่ายขึ้นโดยใช้อ็อกเท็ตแทนที่จะเป็นเลขฐานสิบหกที่มีขอบเขต จำกัด (ใช่พวกมันยังแบ่งออกเป็น 4 ด้วย)

เห็นได้ชัดว่ามีการประหยัดต้นทุนด้วยการใช้หมายเลขฐาน 8 แทน 12 บิตใน BCD หลักแรกเท่านั้นที่สามารถเป็น 0-4 แต่ที่สองที่สามและสี่อาจ 0-9 หากสิ่งนี้ทำในรูปแบบเลขฐานสิบหกค่าหนึ่งจะมีอักขระฐานสิบหกตัว แต่แต่ละตัวมีค่าที่เป็นไปได้ 16 ค่า มันถูกกว่าที่จะผลิตหลอด nixieที่มีเพียง 0-7 มากกว่าหนึ่งที่มี 0-9 (พร้อมตรรกะเพิ่มเติมสำหรับ BCD) หรือ 0-F สำหรับเลขฐานสิบหก

หนึ่งยังคงเห็น octal วันนี้ด้วยสิทธิ์ไฟล์ unix (755, 644) ที่เจ้าของกลุ่มและโลกแต่ละมี 3 บิตแสดงสิทธิ์


ในโลกคณิตศาสตร์บางครั้งบางครั้งก็ทำสิ่งแปลก ๆ ที่มีฐานที่แตกต่างกัน ยกตัวอย่างเช่นลำดับ Goodstein อ่อนแอจากโครงการออยเลอร์ 396 ... หรือสิ่งที่ง่ายกับตัวเลข palindromic มีทรัพย์สินของตัวเลขในฐานเป็นNว่าเป็นจำนวนที่มีหลาย1 - NจะมีตัวเลขของตนรวมถึงหลายของN - 1 Furtermore ถ้าN - 1เป็นตารางที่สมบูรณ์แห่งนี้ยังมีอยู่สำหรับ sqrt ( N - 1 ) แอปพลิเคชั่นนี้มีปัญหาทางคณิตศาสตร์บางอย่าง


1
Octal เป็นเพราะ PDP มีจำนวนไบต์ 9/18 บิตเลขฐานแปดแสดงถึง 3 บิตดังนั้นหากคุณหารด้วย 3 หารด้วย 3 จะทำให้รู้สึกเป็นจำนวนมาก
Martin Beckett

1
Octal ยังใช้กับระบบ 16 บิตบางตัว (ที่โดดเด่นที่สุดคือ PDP-11) เพราะ15 - จำนวนบิตยกเว้นเครื่องหมายบิต - แบ่งออกเป็น 3 อย่างชัดเจนมันถูกใช้อย่างกว้างขวางในระบบปฏิบัติการ UNIX ดั้งเดิม (ตัวอย่างเช่น "od" เป็นเครื่องมือมาตรฐานในการถ่ายโอนไฟล์ไบนารีและรูปแบบเริ่มต้นของมันคือฐานแปด 16 บิตแทนที่จะเป็นฐานสิบหก 8 บิต) ไม่ใช่เพียงเพื่อขออนุญาตเท่านั้น นอกจากนี้ยังอาจเกี่ยวข้องกับชุดคำสั่ง PDP-11 ที่มีตัวถูกดำเนินการ 6 บิตสองฟิลด์
Random832

Octal ยังใช้เพราะสามารถแสดงบนเทคโนโลยีในเวลา หลอด Nexi ทุกคน? หรือแสดงอื่น ๆ 0-9? ใช้เวลาสักครู่สำหรับการแสดง AF เพื่อให้ปรากฏขึ้น
Jeremy J Starcher

1

ในอุตสาหกรรมการเงินจะมีโครงการที่ระบุว่ามีประสิทธิภาพฐาน 36 มันใช้ตัวเลข 0-9 และตัวอักษร BZ เพื่อแสดงตัวเลข 0-35 มันข้ามสระเพื่อป้องกันไม่ให้ชื่อที่น่ารังเกียจถูกสร้างขึ้น

อย่างไรก็ตามมันไม่สมบูรณ์แบบ มีเวลาเมื่อ บริษัท B000BZหนึ่งที่โชคร้ายมีประชาชนได้


1

เหตุผล # 1: เนื่องจากตัวเลขทั้งหมดที่ระดับวงจรแสดงเป็นฐาน 2 (สวิตช์เปิด / ปิดไฟฟ้า) เหตุผลที่ # 2: เนื่องจากที่ระดับสูงกว่าวงจรจริงหนึ่งระดับบิตจะถูกจัดกลุ่มเป็นไบต์และไบต์สามารถแสดงได้อย่างง่ายดายเป็นเลขฐานสิบหกสองหลักเมื่อมันต้องใช้ทศนิยม 3 หลัก (และการตรวจสอบบางอย่าง) เพื่อแสดงค่าที่เป็นไปได้ทั้งหมด ไบต์

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


1

พื้นที่หนึ่งที่มีการใช้ตัวเลขฐาน 16 (ฐานสิบหก) บ่อยครั้งมากคือการระบุสีโดยเฉพาะอย่างยิ่งเมื่อใช้ HTML / CSS สำหรับเว็บ สีที่เราใช้บนหน้าจอดิจิตอลนั้นมีการระบุโดยใช้ค่าความเข้ม 3 ค่าสำหรับสี 3 "ฐาน" (RGB - แดง, เขียว, น้ำเงิน) ที่ผสมเข้าด้วยกันเพื่อสร้างสีที่สามารถแสดงผลได้ 16 ล้านสี (โดยใช้สี 24 บิต )

ตัวอย่างเช่นสีเขียวเข้มเต็มในฐานสิบหกจะเป็น0x00ff00และ65280ในรูปทศนิยม ตอนนี้คิดว่าพยายามที่จะ "ด้วยตนเอง" ผสมสีในหัวของคุณที่มีส่วนเท่า ๆ กันสีแดงและสีฟ้ากล่าวว่าในครึ่งเข้มเพื่อสร้างความสุขสีม่วง :) ในฐานสิบหกนี้จะเขียนเพียงว่าในขณะที่ค่าทศนิยมสำหรับเรื่องนี้จะเป็น0x800080 8388736จะได้รับง่ายยิ่งขึ้นเมื่อทำงานกับเฉดสีเทา - 50% สีเทา0x808080(Hex) และ8421504(ทศนิยม) 75% เป็น0xC0C0C0และ12632256และอื่น ๆ

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

ตรวจสอบหน้าเว็บใด ๆ (และโดยเฉพาะอย่างยิ่ง CSS) สำหรับจำนวนการใช้ hex ที่บ้าคลั่ง: D

หมายเหตุ: ใน CSS ค่าเลขฐานสิบหกจะถูกเขียนโดยใช้#คำนำหน้าเช่น: #00ff00สำหรับสีเขียวและบางครั้งก็ย่อให้เหลือเพียงสามหลักเช่น#0f0สีเขียว


0

สำหรับอัลกอริทึมบางตัวฐาน 2 จะสมเหตุสมผลมากกว่าสิ่งอื่นใด ตัวอย่างเช่นคุณอยากจะเขียนฟังก์ชั่นเพื่อสำรวจต้นไม้ไบนารีหรือต้นไม้ 10-ary?

แต่บ่อยครั้งที่ใช้เบส 2 เพราะนั่นคือวิธีที่คอมพิวเตอร์ใช้แทนตัวเลขเกือบทั้งหมด ซึ่งหมายความว่า:

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

นอกจากนี้ยังมีแอปพลิเคชั่นที่หายากที่ต้องมีฐานแปลก ๆ ซึ่งอาจไม่ใช่ 2 หรือ 10


2
แน่นอนฉันจะใช้ต้นไม้ 10-ary 2ตัวละครแปลก ๆ ที่คุณใช้อยู่คืออะไร?
CodesInChaos

0

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

เหตุผลสำหรับฐาน x

ฐาน 10 - โมเดลของสิ่งของเราทั้งหมดเพราะเรามีตัวเลขนับ 10 หลัก (ฟุตนั้นแปลกและเหม็นดังนั้นเราจึงไม่ใช้สิ่งเหล่านี้)

ฐาน 2 - คอมพิวเตอร์ใช้สิ่งนี้สำหรับบิต (เปิด / ปิด) สิ่งนี้เกี่ยวข้องกับระดับแรงดันไฟฟ้าที่อ่านได้ซึ่งถูกแพร่กระจายโดยเกต / ทรานซิสเตอร์ / ตัวเก็บประจุ

Base 8 - Old, back เมื่อคอมพิวเตอร์ไม่ได้มีขนาดใหญ่มาก (หรือย้อนกลับไปเมื่อพวกเขามีพื้นที่ฉลาด) มันดีสำหรับบางอย่างหรืออย่างอื่น (ฉันไม่ชอบเลยสักนิด)

ฐาน 16 - เหมาะสำหรับการแสดงปลายด้านบนและล่างของไบต์สำหรับการจัดการบิต สิ่งนี้มีประโยชน์อย่างมากในโลก / fpga / hardware ที่ฝังตัว

ฐานปกติในคอมพิวเตอร์

เพื่อไปกับการตั้งค่าฉันสามารถบอกคุณได้อย่างชัดเจนว่า "บน" สีอยู่ในค่าฐานสิบหก RGB ที่มอบให้ฉันคือนี้จึงสามารถแสดงใน int เดียวในฮาร์ดแวร์และจากนั้นมีการเปลี่ยนแปลงบางอย่างสามารถกลับมาให้ฉัน easy-peasy, 1 color color = 1 จุดข้อมูลที่เหมาะสำหรับการประมวลผลภาพขนาดใหญ่พร้อมหน่วยความจำ จำกัด เปรียบเทียบกับการนำเสนอฐาน 10 คุณสามารถเพิ่มพวกเขาทั้งหมดและเก็บไว้ในตัวเลข แต่จำนวนใดหรือ R คือเวลา 10000, G คือ 100 และ B เป็นพื้นที่ของตัวเองนั่นคือการดำเนินการทางคณิตศาสตร์มากมาย โดยปกติการคูณจะมีค่าใช้จ่ายมากกว่าการเปลี่ยนแปลงดังนั้นข้อมูลชิ้นต่อไปของคุณจึงอยู่ในคิวก่อนที่คุณจะเสร็จสิ้นเมื่อชิ้นส่วนสุดท้ายของคุณกำลังถูกประมวลผลอ๊ะนั่นมันหายไปแล้ว

บางครั้งการทำงานในฐาน 2, 8 หรือ 16 ดีกว่าด้วยเครื่องจักรส่วนใหญ่ที่คูณด้วย 2 เป็นบิตกะพวกมันเร็วมากเหมือนกับหารด้วย 2

เพื่ออธิบายเพิ่มเติมเกี่ยวกับแนวคิดของการทวิบิต มีหลายครั้งที่ทำงานในสภาพแวดล้อมแบบฝังตัวที่ฉันต้องใช้ในการเข้าถึงไฟสวิตช์หรือรายการที่แมปทะเบียนอื่น ๆ

ในกรณีนี้การกำหนดทั้ง char, byte, หรือ int ให้กับแต่ละสวิตช์จะไม่มีประสิทธิภาพและไร้สาระสวิตช์หรือแสงมี 2 ตำแหน่ง - เปิดและปิด - ทำไมฉันต้องกำหนดบางสิ่งที่มีมากถึง 256 ตำแหน่งหรือ 2 ^ 16 ตำแหน่งแสงแต่ละประเภทในอาเรย์อาจเป็น 1 บิตที่เหมาะสม 8 หรือ 16 หรือ 32 หรือ 64 หรือ 64 หรือ 128 (ความกว้างของประเภทข้อมูลของคุณ) ในคำเดียว / ลงทะเบียน ประสิทธิภาพของพื้นที่เป็นสิ่งจำเป็นและค่อนข้างต้อนรับ

การใช้ทุกอย่างที่เป็นฐาน 2 ^ n ในการเขียนโปรแกรมสำหรับสิ่งต่าง ๆ เช่นการจัดการข้อมูล RGB ข้อมูลสัญญาณจำนวนมาก - GPS, เสียง, ascii และอื่น ๆ นั้นง่ายกว่ามากในรูปแบบเลขฐานสองฐานหกและฐานแปดเนื่องจากเป็นวิธีการแสดงในเครื่อง มองเห็นสิ่งที่ถูกนำเสนอได้ง่ายขึ้นและวิธีจัดการมัน

การใช้ฐานที่แปลก

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


0

ย้อนกลับไปในสมัยโบราณของคอมพิวเตอร์เรามีจอแสดงผลจำนวนหนึ่งที่สามารถแสดงตัวเลข 0-9 แต่เรายังไม่มีระบบโฟกัสอัตโนมัติ

http://ad7zj.net/kd7lmo/images/ground_nixie_front.jpgเป็นตัวอย่างหนึ่ง ...

Octal พอดีจริง ๆ กับจอแสดงผลเหล่านี้และง่ายกว่าไบนารีหรือทศนิยม


0

ฉันประหลาดใจที่คำตอบอื่น ๆ ทั้งหมดยังไม่ได้กล่าวถึงการใช้งานทั่วไปสองอย่างในการคำนวณสำหรับฐานอื่น:

  1. การเข้ารหัส : การเข้ารหัส Base64 เป็นเรื่องธรรมดามาก การเข้ารหัสตีความชุดของไบต์เป็นเลขฐานสองขนาดใหญ่ (ฐาน 2) และแปลงตัวเลขนั้นให้เป็นตัวเลข Base64 ที่แสดงด้วยหลัก ASCII
  2. การบีบอัด : บ่อยครั้งเป็นที่พึงปรารถนาที่จะแสดงเลขฐานสองฐานสิบหรือเลขฐานสิบหกในฐานที่มีขนาดใหญ่กว่าเพื่อย่อการแสดง ตัวอย่างเช่นตัวย่อบิตทั้งหมดเช่น bit.ly กำลังทำสิ่งนี้อยู่ หรือคุณอาจใช้ GUID สั้นลงเพื่อใช้ใน URL

    - 821F6321-881B-4492-8F84-942186DF059B (base-16 guid) 
    becomes
    - RRIDHW463YD8YXX7MIDI (base-36)
    - 3UFmaWDjj9lifYyuT0 (base-62)
    
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.