เลขฐานสิบหกในประโยคเดียว
เลขฐานสิบหกคือระบบเลขเชิงตำแหน่งที่มีฐาน 16: แต่ละหลักมีค่ามากกว่าหลักทางขวา 16 เท่า และค่า 10 ถึง 15 เขียนด้วยตัวอักษร A ถึง F เพื่อระบุว่าเป็นเลขฐานสิบหก โปรแกรมเมอร์จะเขียน 0x1A (C, Java, JavaScript, Python), #1A2B3C สำหรับสีใน CSS, 1Ah ในภาษาแอสเซมบลี หรือ 1A₁₆ ในทางคณิตศาสตร์
เลขโดดฐานสิบหกตั้งแต่ 0 ถึง 15
| ฐานสิบ | Hex | ฐานสอง | ฐานสิบ | Hex | ฐานสอง |
|---|---|---|---|---|---|
| 0 | 0 | 0000 | 8 | 8 | 1000 |
| 1 | 1 | 0001 | 9 | 9 | 1001 |
| 2 | 2 | 0010 | 10 | A | 1010 |
| 3 | 3 | 0011 | 11 | B | 1011 |
| 4 | 4 | 0100 | 12 | C | 1100 |
| 5 | 5 | 0101 | 13 | D | 1101 |
| 6 | 6 | 0110 | 14 | E | 1110 |
| 7 | 7 | 0111 | 15 | F | 1111 |
การนับเลขฐานสิบหก
การนับเลขฐานสิบหกเหมือนฐานสิบ แต่จะขึ้นหลักใหม่หลัง F แทนที่จะเป็นหลัง 9: … 8, 9, A, B, C, D, E, F, 10, 11 … 19, 1A … 1F, 20 … FF, 100 ในที่นี้ 10 หมายถึงสิบหก และ 100 หมายถึง 16 × 16 = 256 เลข hex สองหลักครอบคลุมหนึ่งไบต์ (00–FF = 0–255) สี่หลักไปได้ถึง FFFF = 65,535 และแปดหลักไปได้ถึง FFFFFFFF = 4,294,967,295
ทำไมคอมพิวเตอร์จึงใช้เลขฐานสิบหก
คอมพิวเตอร์เก็บทุกอย่างเป็นเลขฐานสอง แต่แถวของ 0 และ 1 ที่ยาวเหยียดนั้นอ่านยากและพิมพ์ผิดได้ง่าย เนื่องจาก 16 = 2⁴ เลข hex หนึ่งหลักจึงแทน 4 บิต (nibble) พอดี และ hex สองหลักแทนหนึ่งไบต์ การแปลงระหว่าง hex กับเลขฐานสองทำได้ง่าย ๆ ด้วยการเทียบทีละหลัก และ hex ยังสั้นกว่าถึง 4 เท่า: 1101 1110 1010 1101 เขียนเป็นแค่ DEAD ส่วนเลขฐานสิบไม่มีความสัมพันธ์ที่ลงตัวแบบนี้กับเลขฐานสอง จึงแทบไม่ใช้กับข้อมูลดิบ
การแปลงเลขฐานสิบหกเป็นฐานสิบและกลับกัน
- Hex เป็นฐานสิบ: คูณแต่ละหลักด้วย 16 ยกกำลังตามตำแหน่ง แล้วนำมารวมกัน:
2F= 2 × 16 + 15 = 47 และ1A3F= 1 × 4096 + 10 × 256 + 3 × 16 + 15 = 6719 - ฐานสิบเป็น hex: หารด้วย 16 ซ้ำ ๆ แล้วอ่านเศษย้อนกลับ: 200 ÷ 16 = 12 เศษ 8 และ 12 = C ดังนั้น 200 =
C8 - Hex เป็นฐานสอง: แทนแต่ละหลักด้วย 4 บิต:
2F=0010 1111
เครื่องมือแปลงเลขฐานของเราทำทั้งหมดนี้ได้ทันทีและแสดงวิธีทำทุกขั้นตอน
เลขฐานสิบหกถูกใช้ที่ไหนบ้าง
- สีบนเว็บ:
#FF6347คือแดงFFเขียว63และน้ำเงิน47 - ที่อยู่หน่วยความจำ: ดีบักเกอร์และรายงานข้อผิดพลาดจะแสดง pointer เช่น
0x7FFE5A3C - MAC address: ข้อมูล 6 ไบต์ เช่น
00:1A:2B:3C:4D:5Eใช้ระบุการ์ดเครือข่าย - IPv6 address: เลข hex แปดกลุ่ม กลุ่มละสี่หลัก เช่น
2001:db8::1 - Unicode: อักขระทุกตัวมี code point เป็นเลขฐานสิบหก –
U+00E9คือ é,U+1F600คือ 😀 และอักษรไทยอยู่ในช่วง U+0E00–U+0E7F - Hash และ ID: ค่า hash แบบ SHA-256 ยาว 64 อักขระ hex ส่วน UUID และ commit ID ของ Git ก็เขียนเป็น hex
- Hex dump: hex editor แสดงเนื้อหาไฟล์ทีละไบต์ ทุกไฟล์ PDF ขึ้นต้นด้วย
25 50 44 46(“%PDF”) - รหัสข้อผิดพลาด: Windows แจ้งข้อผิดพลาด เช่น
0x80070005(ปฏิเสธการเข้าถึง)
เปรียบเทียบเลขฐานสิบหก ฐานสิบ ฐานแปด และฐานสอง
| ระบบ | ฐาน | ตัวเลขที่ใช้ | 255 เขียนเป็น | การใช้งานทั่วไป |
|---|---|---|---|---|
| ฐานสอง | 2 | 0–1 | 11111111 | ฮาร์ดแวร์, bit flag |
| ฐานแปด | 8 | 0–7 | 377 | สิทธิ์ไฟล์บน Unix (chmod 755) |
| ฐานสิบ | 10 | 0–9 | 255 | ตัวเลขในชีวิตประจำวัน |
| ฐานสิบหก | 16 | 0–9, A–F | FF | ไบต์ สี ที่อยู่หน่วยความจำ hash |
เลขติดลบในฐานสิบหก
เลขฐานสิบหกไม่มีเครื่องหมายพิเศษสำหรับค่าลบ จำนวนลบจึงมักถูกเก็บในรูปแบบ two's complement: บิตสูงสุดของค่าที่มีขนาดคงที่จะบอกว่าเป็นจำนวนลบ เมื่อเป็นไบต์แบบมีเครื่องหมาย 7F คือ 127, 80 คือ −128 และ FF คือ −1 ส่วนเมื่อเป็นจำนวนเต็ม 32 บิต FFFFFFFF คือ −1 ในทางคณิตศาสตร์และในเครื่องคิดเลขของเรา คุณยังเขียนเครื่องหมายลบได้ตามปกติ: −1A = −26
คำถามที่พบบ่อย
ทำไมเลขฐานสิบหกจึงใช้ตัวอักษร?
ฐาน 16 ต้องใช้เลขโดดที่เป็นอักขระเดียว 16 ตัว แต่ตัวเลขมีแค่ 10 ตัว ตัวอักษร A–F จึงใช้แทนค่า 10–15 ตัวพิมพ์ใหญ่และตัวพิมพ์เล็กมีความหมายเหมือนกัน: ff = FF = 255
0x หน้าตัวเลขหมายความว่าอะไร?
เป็นการระบุว่าตัวเลขนั้นเป็นเลขฐานสิบหกในภาษา C, C++, Java, JavaScript, Python และภาษาอื่น ๆ อีกมาก: 0x10 คือ 16 ไม่ใช่สิบ ส่วน CSS ใช้ # สำหรับสีแทน และโค้ดแอสเซมบลีมักเติม h ต่อท้าย (10h)
เลขฐานสิบหกเหมือนกับ Base64 หรือไม่?
ไม่เหมือน hex เขียนแต่ละไบต์เป็นอักขระสองตัวจาก 0–9 และ A–F ข้อมูลจึงมีขนาดเพิ่มเป็นสองเท่า แต่ยังอ่านทีละไบต์ได้ง่าย ส่วน Base64 ใช้อักขระ 64 ตัวและบรรจุ 3 ไบต์ลงใน 4 อักขระ จึงกระชับกว่า (เพิ่มขนาดราว 33%) แต่อ่านทีละไบต์ไม่ได้
อัปเดตล่าสุด: