/อ่าน 7 นาที

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^01
ตำแหน่ง 18^18
ตำแหน่ง 28^264
ตำแหน่ง 38^3512
ตำแหน่ง 48^44096

ดังนั้นเลข 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 บิตได้พอดี:

OctalBinaryDecimal
00000
10011
20102
30113
41004
51015
61106
71117

นั่นหมายความว่าเราสามารถแปลงระหว่าง 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 octal

Octal และ 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 -> 0o643

Octal ใน Unix File Permissions

Unix และ Linux file permissions คือจุดที่ octal เด่นมาก สิทธิ์ไฟล์ถูกจัดเป็น บิต 3 กลุ่ม กลุ่มละ 3 บิต ได้แก่ owner, group และ others

Permissionสัญลักษณ์บิตฐานสองค่า Octal
Readr1004
Writew0102
Executex0011

เพราะ 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 ที่พบบ่อย:

OctalSymbolicการใช้งานทั่วไป
755rwxr-xr-xไฟล์ executable, script และ directory
644rw-r--r--ไฟล์ทั่วไปและ config files
600rw-------ไฟล์ส่วนตัว เช่น SSH keys
777rwxrwxrwxทุกคนเข้าถึงได้เต็มที่ โดยทั่วไปควรหลีกเลี่ยงใน production
400r--------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 pattern

Python

# 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-70-9 และ A-F
บิตต่อหลัก34
เหมาะกับPermissions และกลุ่ม 3 บิตไบต์ สี และ memory addresses
1 byte หรือ 8 bitsต้องใช้ 3 หลักพร้อม padding หรือ overflow2 หลักพอดี
การใช้งานปัจจุบัน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

แหล่งอ้างอิง

  1. Ritchie, D.M. & Thompson, K. (1974). The UNIX Time-Sharing System. Communications of the ACM, 17(7). https://dsf.berkeley.edu/cs262/unix.pdf
  2. IEEE & The Open Group. chmod - change the file modes. POSIX.1-2017. https://pubs.opengroup.org/onlinepubs/9699919799/utilities/chmod.html
  3. Mozilla Developer Network. parseInt() - JavaScript. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt
  4. Python Software Foundation. Built-in Functions: oct(). https://docs.python.org/3/library/functions.html#oct
  5. Knuth, D.E. (1997). The Art of Computer Programming, Volume 2: Seminumerical Algorithms. Addison-Wesley Professional.
USTHJP