Octal คืออะไร? ระบบเลขฐาน 8 อธิบายแบบเข้าใจง่าย
Octal เป็นระบบเลขที่มีประโยชน์มากในงานคอมพิวเตอร์ ใช้กับ Unix file permissions พบใน literal ของภาษาโปรแกรม และช่วยให้มนุษย์อ่านกลุ่มบิตฐานสองได้สั้นลง
สารบัญ
Octal คืออะไร?
Octal หรือ เลขฐาน 8 เป็นระบบเลขแบบตำแหน่งที่ใช้ตัวเลขเพียง 8 ตัว คือ 0 ถึง 7 หลักการคล้ายเลขฐานสิบ แต่แต่ละตำแหน่งอิงกับกำลังของ 8 แทนกำลังของ 10
ในงานคอมพิวเตอร์ มักเขียนค่า octal ด้วย prefix 0o เพื่อไม่ให้สับสนกับเลขฐานสิบ เช่น 0o17 ในฐาน 8 มีค่าเท่ากับ 15 ในฐานสิบ
จุดเด่นของ octal คือเลข octal 1 หลักแทน บิตฐานสองได้พอดี 3 บิต ความสัมพันธ์ที่สะอาดนี้ทำให้ octal เป็นที่นิยมในคอมพิวเตอร์ยุคแรก และยังสำคัญมากใน Unix file permissions จนถึงปัจจุบัน
Octal ทำงานอย่างไร
เหมือนระบบเลขแบบตำแหน่งอื่น ๆ ค่าของแต่ละหลักขึ้นอยู่กับตำแหน่งของมัน ใน octal แต่ละตำแหน่งคือกำลังของ 8:
| ตำแหน่ง | กำลังของ 8 | ค่าในฐานสิบ |
|---|---|---|
| ตำแหน่ง 0 ขวาสุด | 8^0 | 1 |
| ตำแหน่ง 1 | 8^1 | 8 |
| ตำแหน่ง 2 | 8^2 | 64 |
| ตำแหน่ง 3 | 8^3 | 512 |
| ตำแหน่ง 4 | 8^4 | 4096 |
ดังนั้นเลข octal 375 หมายถึง:
3 x 8^2 = 3 x 64 = 192
+ 7 x 8^1 = 7 x 8 = 56
+ 5 x 8^0 = 5 x 1 = 5
-----
253 (decimal)ความเชื่อมโยงระหว่าง Octal กับ Binary
เหตุผลที่ octal สะดวกในคอมพิวเตอร์คือ 8 = 2^3 เลข octal 1 หลักจึงแทนกลุ่มบิตฐานสอง 3 บิตได้พอดี:
| Octal | Binary | Decimal |
|---|---|---|
| 0 | 000 | 0 |
| 1 | 001 | 1 |
| 2 | 010 | 2 |
| 3 | 011 | 3 |
| 4 | 100 | 4 |
| 5 | 101 | 5 |
| 6 | 110 | 6 |
| 7 | 111 | 7 |
นั่นหมายความว่าเราสามารถแปลงระหว่าง octal กับ binary ทีละหลักได้เลย ไม่ต้องคำนวณยาว:
Octal: 7 5 3
Binary: 111 101 011
So octal 753 = binary 111101011
And going back:
Binary: 1 010 110 100
Octal: 1 2 6 4
So binary 1010110100 = octal 1264การแปลงระหว่าง Octal, Decimal และ Binary
Octal เป็น Decimal
นำแต่ละหลักคูณด้วยกำลังของ 8 ตามตำแหน่ง แล้วบวกผลลัพธ์ทั้งหมด
Octal 755:
7 x 8^2 = 7 x 64 = 448
5 x 8^1 = 5 x 8 = 40
5 x 8^0 = 5 x 1 = 5
-----
493 (decimal)Decimal เป็น Octal
หารด้วย 8 ซ้ำ ๆ แล้วเก็บเศษ จากนั้นอ่านเศษจากล่างขึ้นบน
Convert 493 to octal:
493 / 8 = 61 remainder 5
61 / 8 = 7 remainder 5
7 / 8 = 0 remainder 7
Read the remainders upward: 755
493 decimal = 755 octalOctal และ Binary
แทนเลข octal แต่ละหลักด้วยกลุ่ม binary 3 บิต หรือแบ่ง binary เป็นกลุ่มละ 3 บิตจากด้านขวา
Octal to Binary:
0o755 -> 7=111 5=101 5=101 -> 111 101 101
Binary to Octal:
110100011 -> group by 3 from right: 110 100 011
6 4 3 -> 0o643Octal ใน Unix File Permissions
Unix และ Linux file permissions คือจุดที่ octal เด่นมาก สิทธิ์ไฟล์ถูกจัดเป็น บิต 3 กลุ่ม กลุ่มละ 3 บิต ได้แก่ owner, group และ others
| Permission | สัญลักษณ์ | บิตฐานสอง | ค่า Octal |
|---|---|---|---|
| Read | r | 100 | 4 |
| Write | w | 010 | 2 |
| Execute | x | 001 | 1 |
เพราะ permission แต่ละกลุ่มมี 3 บิตพอดี เลข octal 1 หลักจึงแทน permission ได้ครบ 1 กลุ่ม ตัวอย่างคลาสสิก chmod 755 แยกได้ดังนี้:
chmod 755 file.sh
7 = 4+2+1 = rwx -> Owner: read + write + execute
5 = 4+0+1 = r-x -> Group: read + execute
5 = 4+0+1 = r-x -> Others: read + execute
Binary: 111 101 101
Symbol: rwx r-x r-xรูปแบบ permission ที่พบบ่อย:
| Octal | Symbolic | การใช้งานทั่วไป |
|---|---|---|
755 | rwxr-xr-x | ไฟล์ executable, script และ directory |
644 | rw-r--r-- | ไฟล์ทั่วไปและ config files |
600 | rw------- | ไฟล์ส่วนตัว เช่น SSH keys |
777 | rwxrwxrwx | ทุกคนเข้าถึงได้เต็มที่ โดยทั่วไปควรหลีกเลี่ยงใน production |
400 | r-------- | owner อ่านได้อย่างเดียว เช่น secrets ที่ deploy แล้ว |
Octal ในภาษาโปรแกรม
ภาษาโปรแกรมหลายภาษารองรับ octal literals แต่ syntax ต่างกัน:
JavaScript
// Modern octal (ES6+) - recommended
const permissions = 0o755; // 493 in decimal
const mask = 0o022; // 18 in decimal
// Parse octal string to number
parseInt("755", 8); // 493
// Convert decimal to octal string
(493).toString(8); // "755"
// Legacy leading-zero octal is confusing
// const old = 0755; // Avoid this patternPython
# Octal literal
permissions = 0o755 # 493 in decimal
# Convert decimal to octal string
oct(493) # '0o755'
# Parse octal string to int
int("755", 8) # 493
# Set file permissions
import os
os.chmod("script.sh", 0o755)C / C++
// Octal literals use a leading 0
int perms = 0755; // 493 in decimal
int mask = 022; // 18 in decimal
// Print in octal
printf("%o\n", 493); // Prints: 755
// Common bug:
int x = 010; // This is 8, not 10กับดัก octal คลาสสิกใน C/C++
ใน C และ C++ ตัวเลขที่ขึ้นต้นด้วย 0 จะถูกตีความเป็น octal ดังนั้น 010 จึงเท่ากับ 8 ไม่ใช่ 10 จุดนี้ทำให้ผู้เริ่มต้นสับสนได้ง่าย โดยเฉพาะเมื่อเติมศูนย์นำหน้าตัวเลข
ประวัติย่อของ Octal
Octal มีประวัติยาวนานกว่าที่นักพัฒนาหลายคนคิด:
- ก่อนยุคคอมพิวเตอร์ - บางวัฒนธรรมเคยใช้ระบบนับฐาน 8 เช่น การนับช่องว่างระหว่างนิ้วแทนการนับนิ้วโดยตรง
- ทศวรรษ 1950 และ 1960 - เครื่องคอมพิวเตอร์ยุคแรกที่มี word size เช่น 12, 18, 24 และ 36 บิต เหมาะกับ octal มาก เพราะแบ่งเป็นกลุ่ม 3 บิตได้ลงตัว
- ยุค Unix - Unix ใช้โมเดล permission 9 บิต คือ 3 บิตสำหรับ owner, group และ others เลข octal 3 หลักจึงแทนโมเดลนี้ได้พอดี
- คอมพิวเตอร์ยุคใหม่ - เมื่อไบต์ 8 บิตกลายเป็นมาตรฐาน hexadecimal จึงถูกใช้แพร่หลายกว่า แต่ octal ยังอยู่ในงานที่เกี่ยวกับกลุ่ม 3 บิต
Octal เทียบกับ Hexadecimal
Octal และ hexadecimal ต่างก็เป็นวิธีเขียน binary ให้สั้นลง แต่แบ่งกลุ่มบิตต่างกัน:
| คุณสมบัติ | Octal (ฐาน 8) | Hexadecimal (ฐาน 16) |
|---|---|---|
| ตัวเลขที่ใช้ | 0-7 | 0-9 และ A-F |
| บิตต่อหลัก | 3 | 4 |
| เหมาะกับ | Permissions และกลุ่ม 3 บิต | ไบต์ สี และ memory addresses |
| 1 byte หรือ 8 bits | ต้องใช้ 3 หลักพร้อม padding หรือ overflow | 2 หลักพอดี |
| การใช้งานปัจจุบัน | Unix permissions และ legacy code บางส่วน | ครองงาน low-level ส่วนใหญ่ |
Hexadecimal ชนะในงาน low-level ทั่วไปเพราะ 1 byte มี 8 บิต และแทนได้พอดีด้วย hex 2 หลัก แต่สำหรับ การจัดกลุ่ม 3 บิต โดยเฉพาะ Unix permissions นั้น octal ยังเป็นตัวเลือกที่อ่านง่ายและเป็นธรรมชาติที่สุด
แปลงเลข Octal ได้ทันที
ใช้เครื่องมือ Octal Converter ฟรีของเราเพื่อแปลงระหว่าง octal, decimal, binary และ hexadecimal ได้ทันทีในเบราว์เซอร์
ลองใช้ Octal Converterแหล่งอ้างอิง
- Ritchie, D.M. & Thompson, K. (1974). The UNIX Time-Sharing System. Communications of the ACM, 17(7). https://dsf.berkeley.edu/cs262/unix.pdf
- IEEE & The Open Group. chmod - change the file modes. POSIX.1-2017. https://pubs.opengroup.org/onlinepubs/9699919799/utilities/chmod.html
- Mozilla Developer Network. parseInt() - JavaScript. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt
- Python Software Foundation. Built-in Functions: oct(). https://docs.python.org/3/library/functions.html#oct
- Knuth, D.E. (1997). The Art of Computer Programming, Volume 2: Seminumerical Algorithms. Addison-Wesley Professional.