Open any programming book and you'll see hex (base 16) numbers everywhere. 0xFF, 0x80, #RRGGBB color codes, 0x7FFFFFFF max integer. Why? Because hex is the most efficient human-readable representation of binary data — and binary is what computers actually use.
The hex advantage: 4 bits per character
Hex uses 16 distinct symbols (0–9, A–F). 16 = 2⁴, so each hex digit represents exactly 4 bits. This makes hex perfectly aligned with binary:
- 1 hex digit = 4 binary bits = a "nibble"
- 2 hex digits = 1 byte (8 bits)
- 4 hex digits = 2 bytes = a "word"
- 8 hex digits = 4 bytes = a "double word"
This 1:4 ratio means converting between hex and binary is mechanical, no math needed. F = 1111. 1010 = A. 0xFF = 11111111.
Why not decimal?
Decimal (base 10) doesn't divide cleanly into bits. 10 isn't a power of 2. So:
- Decimal 255 = binary 11111111 = hex FF. The byte limit is "obvious" in hex but not decimal.
- Decimal 1024 = binary 10000000000 = hex 0x400. Round numbers in binary aren't round in decimal.
- Decimal 65535 = binary 1111111111111111 = hex 0xFFFF. The 2-byte limit is "FFFF" — easy.
For computer values, hex shows boundaries clearly. Decimal hides them.
Why not octal (base 8)?
Octal uses 8 symbols (0–7), which is 2³. Each octal digit = 3 bits. Worked, but bytes are 8 bits — not divisible by 3 cleanly. Octal aligns with 3-bit boundaries, which doesn't match modern byte-aligned systems.
Hex aligns with the byte boundary perfectly. Octal aligns with the 3-bit boundary, which only mattered on old PDP-11 systems with 3-bit-aligned octets.
Where you'll see hex
Memory addresses: 0x7FFE12345678 — pointing to a specific byte in RAM. Programmers quickly internalize patterns (0x80000000 = top bit set, common boundary).
Color codes: #FF5733 — RGB encoded as 6 hex digits, 2 per channel. Easier than rgb(255, 87, 51) for compactness.
Network packets: Wireshark captures show hex bytes for any byte-by-byte analysis.
File hashes: SHA-256 hashes shown as 64 hex characters. The full output is 256 bits / 4 bits per char = 64 chars.
Encryption keys: AES-128 keys are 32 hex chars (128 bits / 4).
Bit manipulation: 0xFF = "set all bits in this byte." 0x01 = "just the low bit." 0xFFFFFFFE = "all bits except the low bit." Common bitmasks are intuitive in hex.
Embedded programming: microcontroller registers are typically described in hex. "Set bit 3 of register 0x40000000" is a natural instruction.
Why colors use hex
Web colors are RGB, with each channel being 0–255. Decimal: rgb(255, 87, 51). Hex: #FF5733.
Hex is shorter, sortable, and the channels are visually distinct (FF / 57 / 33 each is a separate channel). Decimal requires reading three numbers separated by commas.
Plus: HTML/CSS allows the 3-digit shorthand #F73 (each digit doubled to FF77 33). Decimal can't compress this way.
Why hex is awkward
For non-programmer use cases, hex is harder than decimal:
- "How many cows do you have?" needs decimal, not "0x10."
- Math without a calculator: hex addition requires you to remember A+5 = F, etc.
- Memory: most people internalized 0–9 as a child; A–F is later, weaker training.
So hex is excellent for binary alignment but bad for general counting. Programmers use it for the right tasks.
Worked examples
Subnetting: /24 mask = 255.255.255.0 decimal = 0xFFFFFF00 hex. The boundary between network and host bits is right there in the hex.
RGB to hex: red 192 = hex C0. Green 64 = hex 40. Blue 32 = hex 20. Color: #C04020.
Bitmask: "first 4 bits of low byte" = 0x0F. Set: value | 0x0F. Clear: value & ~0x0F.
UUIDs: 32 hex digits (with dashes), e.g., 550e8400-e29b-41d4-a716-446655440000. 128 bits of randomness in 32 hex chars.
The 0x prefix and friends
Common prefixes to indicate non-decimal numbers:
- 0x: hexadecimal (most languages — C, Java, Python, JS, Go)
- 0b: binary (C++14+, Python, Java 7+)
- 0o: octal (Python, Java 7+ with the new syntax)
- No prefix: decimal
Be careful: in older C, "0123" (just leading zero) means octal — different from Python which now uses 0o123. Source of subtle bugs.
Should you learn hex?
If you're:
- A programmer: yes. Hex appears constantly. You'll absorb it from exposure.
- A web designer: yes for colors. The full A–F range becomes intuitive after a year.
- A network engineer: yes. Subnetting and packet analysis use hex.
- A general developer: probably yes for memory inspection, debugging, and integer limits.
- Casual user: no — not unless your hobby touches it.
Practice with the tool
Our binary, decimal, hex converter handles all three bases instantly. Useful for quick conversions during code review, or for sanity-checking that 0xFF is really 255.