- Power
82
Convert Decimal to Octal in PHP
What you’ll learn
- How division by eight and remainders produce octal digits
0–7. - Why zero needs a branch and why digits are printed in reverse of collection order.
- A recursive MSB-first print without an array, a live preview, and ties to binary grouping.
Overview
Octal is base eight. To print a nonnegative decimal integer in octal, repeatedly take n % 8, then replace n by intdiv(n, 8), until n is zero; emit the remainders from last to first.
Two programs
Array + reverse print (classic), then recursion for MSB-first output.
Live preview
Nonnegative safe integers via Number#toString(8).
Pair with binary
Same remainder pattern as decimal-to-binary, divisor 8 instead of 2.
Prerequisites
Integer division and modulo, arrays, for and while loops, optional recursion.
- Basic PHP script structure, functions, and
echo. - Use
intdiv()for clean integer division in conversion loops.
Decimal to octal
Each octal digit is a coefficient on a power of eight: dk8k + … + d080 with every di ∈ {0,…,7}. The peel operation n % 8 reads the least significant octal digit.
Reference value 57: 57 = 7·8 + 1, so octal digits (MSB to LSB) are 7 then 1 → 718.
Division algorithm
For n ≥ 0, let d0 = n mod 8 and n1 = ⌊n/8⌋, then repeat. The sequence of remainders read from last generated to first is the standard octal numeral for n.
5757 = 8·7 + 1, then 7 = 8·0 + 7. Remainders LSB-first: 1, 7 → octal 71.
Intuition
- Sum
7·8 + 1
Takeaway: each % 8 answers “which slice of eight fits in the current place?”
Live preview
Nonnegative integers in the JavaScript safe range. Uses Number#toString(8).
Algorithm (remainder method)
Goal: print octal digits of nonnegative n in MSB-first order.
Special case n == 0
Print 0 when n is zero; while ($n > 0) alone skips the body.
Collect digits
While $n > 0: push $n % 8, then $n = intdiv($n, 8).
Print reversed
Emit stored digits from last pushed to first.
📜 Pseudocode
function printOctalFromDecimal(n): // n ≥ 0
if n = 0:
output "0"; return
digits ← empty list
while n > 0:
append (n mod 8) to digits
n ← floor(n / 8)
print digits in reverse orderDivide by eight with reverse print
Matches the standard interview flow with a zero branch and integer division. Uses a digit buffer and reverse output.
<?php
function decimalToOctal(int $decimalNumber): string
{
if ($decimalNumber === 0) {
return "0";
}
$octalDigits = [];
$n = $decimalNumber;
while ($n > 0) {
$octalDigits[] = (string)($n % 8);
$n = intdiv($n, 8);
}
return implode('', array_reverse($octalDigits));
}
echo "Octal equivalent: " . decimalToOctal(57) . "\n";
echo "Octal equivalent: " . decimalToOctal(0) . "\n";
?>Explanation
Each remainder is in 0..7 by construction, so a single decimal digit per position is enough for display.
while ($n > 0)Same stopping idea as C version, paired with an upfront 0 branch.
Recursive MSB-first (no digit array)
Prints higher groups before lower ones: recurse on intdiv($n, 8), then emit $n % 8. Handles $n == 0.
<?php
function printOctalMsbRecursive(int $n): void
{
if ($n >= 8) {
printOctalMsbRecursive(intdiv($n, 8));
}
echo (string)($n % 8);
}
echo "57 in octal: ";
printOctalMsbRecursive(57);
echo "\n";
echo "0 in octal: ";
printOctalMsbRecursive(0);
echo "\n";
?>Explanation
This keeps code short and readable for beginners because recursion naturally prints digits from left to right.
echo (string)($n % 8);Digit output. Octal digits are always 0 to 7.
Optimization and library path
decoct($n). For nonnegative integer $n, returns octal directly without manual loops.
From binary. Group bits in threes from the right to jump between bases without repeated division by eight.
Interview: state nonnegative assumption, n==0, and the 3-bit grouping trick.
❓ FAQ
🔄 Input / output examples
Example 1 uses 57 and 0; Example 2 repeats 57 and 0 with the recursive printer.
| Decimal | Octal |
|---|---|
0 | 0 |
7 | 7 |
8 | 10 |
57 | 71 |
64 | 100 |
Edge cases and pitfalls
For a beginner page, keep the policy simple: accept nonnegative integers and clearly reject other input.
n == 0
The conversion loop skips zero; always return or print 0 explicitly.
Remainder range
For nonnegative n, n % 8 is always in 0..7. If you see 8 or 9, logic is wrong.
Very large integers
PHP integers are platform-limited. For extremely large values, use big-int libraries and iterative conversion.
Negative policy
If negatives are required, define output format clearly; this page focuses on nonnegative input for clarity.
⏱️ Time and space complexity
| Approach | Time | Extra space |
|---|---|---|
| Remainder + array | O(log8 n) digits | O(log8 n) stored digits |
| Recursion (Example 2) | O(log8 n) | O(log8 n) call frames |
decoct($n) | Implementation-defined; typically O(d) | O(1) |
Here n is the magnitude of a nonnegative input.
Summary
- Idea: collect
n % 8, dividenby8, reverse for display. - Code: guard
0; useintdiv()for integer division in PHP. - Extra: octal lines up with binary in groups of three bits.
Each octal digit corresponds to a block of three binary bits, which is why octal is a handy short form for binary values.
8 people found this page helpful
