Chapter 25: Hexadecimal Numbers
Part 1: What Are Hexadecimal Numbers?
Hexadecimal (often called “hex”) is a base-16 number system. Unlike our familiar decimal system (base-10) which uses ten digits (0-9), hexadecimal uses sixteen symbols:
-
Digits 0-9 represent values 0 through 9
-
Letters A-F represent values 10 through 15
| Hexadecimal Digit | Decimal Value | Binary (4 bits) |
|---|---|---|
| 0 | 0 | 0000 |
| 1 | 1 | 0001 |
| 2 | 2 | 0010 |
| 3 | 3 | 0011 |
| 4 | 4 | 0100 |
| 5 | 5 | 0101 |
| 6 | 6 | 0110 |
| 7 | 7 | 0111 |
| 8 | 8 | 1000 |
| 9 | 9 | 1001 |
| A | 10 | 1010 |
| B | 11 | 1011 |
| C | 12 | 1100 |
| D | 13 | 1101 |
| E | 14 | 1110 |
| F | 15 | 1111 |
Part 2: Why Use Hexadecimal?
1. Compact Representation
One hexadecimal digit represents exactly 4 binary digits (a “nibble”). This means a byte (8 bits) can be represented by just two hexadecimal digits.
For example, the binary number 11110101 becomes F5 in hex—much shorter and easier to remember!
2. Easy Conversion to/from Binary
Converting between hex and binary is straightforward because each hex digit corresponds directly to a 4-bit binary group. There’s no complex calculation—just memorize the table above or learn the pattern.
3. Common in Programming
Hexadecimal appears everywhere in programming:
-
Memory addresses (when debugging, you see addresses like
0x7FFF -
Color codes in web design (
#FFA500for orange) -
Character encodings (ASCII/Unicode values)
-
Machine code and assembly language
-
Network protocols (MAC addresses, IPv6 addresses)
Part 3: Hexadecimal Place Values
Just like decimal (powers of 10) and binary (powers of 2), hexadecimal uses powers of 16.
The rightmost digit is the 16⁰ place (1’s place)
The next digit is the 16¹ place (16’s place)
Then 16² (256’s place)
Then 16³ (4096’s place)
And so on…
Example: The hex number 2A3F means:
| Digit | 2 | A | 3 | F |
|---|---|---|---|---|
| Place Value | 16³ = 4096 | 16² = 256 | 16¹ = 16 | 16⁰ = 1 |
| Contribution | 2 × 4096 = 8192 | 10 × 256 = 2560 | 3 × 16 = 48 | 15 × 1 = 15 |
Total = 8192 + 2560 + 48 + 15 = 10,815 in decimal
Part 4: Converting Between Number Systems
Converting Hexadecimal to Decimal
To convert hex to decimal, multiply each digit by its place value and add them up.
Example 1: Convert 1A to decimal.
| Digit | 1 | A |
|---|---|---|
| Place Value | 16¹ = 16 | 16⁰ = 1 |
| Contribution | 1 × 16 = 16 | 10 × 1 = 10 |
Total = 16 + 10 = 26 decimal
Example 2: Convert FF to decimal.
| Digit | F | F |
|---|---|---|
| Place Value | 16¹ = 16 | 16⁰ = 1 |
| Contribution | 15 × 16 = 240 | 15 × 1 = 15 |
Total = 240 + 15 = 255 decimal (which is why 0xFF is a common value for maximum in many contexts)
In Python:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<span class="token comment"># Using int() with base 16</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token builtin">int</span><span class="token punctuation">(</span><span class="token string">"1A"</span><span class="token punctuation">,</span> <span class="token number">16</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment"># 26</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token builtin">int</span><span class="token punctuation">(</span><span class="token string">"FF"</span><span class="token punctuation">,</span> <span class="token number">16</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment"># 255</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token builtin">int</span><span class="token punctuation">(</span><span class="token string">"2A3F"</span><span class="token punctuation">,</span> <span class="token number">16</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment"># 10815</span> <span class="token comment"># Using hexadecimal literals (0x prefix)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token number">0x1A</span><span class="token punctuation">)</span> <span class="token comment"># 26</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token number">0xFF</span><span class="token punctuation">)</span> <span class="token comment"># 255</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token number">0x2A3F</span><span class="token punctuation">)</span> <span class="token comment"># 10815</span> |
Converting Decimal to Hexadecimal
To convert decimal to hex, repeatedly divide by 16 and collect the remainders from bottom to top.
Example: Convert decimal 255 to hexadecimal.
| Division | Quotient | Remainder | Hex Digit |
|---|---|---|---|
| 255 ÷ 16 | 15 | 15 | F |
| 15 ÷ 16 | 0 | 15 | F |
Reading remainders from bottom to top: FF
Example: Convert decimal 10815 to hexadecimal.
| Division | Quotient | Remainder | Hex Digit |
|---|---|---|---|
| 10815 ÷ 16 | 675 | 15 | F |
| 675 ÷ 16 | 42 | 3 | 3 |
| 42 ÷ 16 | 2 | 10 | A |
| 2 ÷ 16 | 0 | 2 | 2 |
Reading remainders from bottom to top: 2A3F
In Python:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 |
<span class="token comment"># Using hex() function</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token builtin">hex</span><span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment"># 0xff</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token builtin">hex</span><span class="token punctuation">(</span><span class="token number">10815</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment"># 0x2a3f</span> <span class="token comment"># Using format() for more control</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token builtin">format</span><span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">,</span> <span class="token string">'X'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment"># FF (uppercase)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token builtin">format</span><span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">,</span> <span class="token string">'x'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment"># ff (lowercase)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token builtin">format</span><span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">,</span> <span class="token string">'#X'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment"># 0XFF (with prefix)</span> |
Converting Between Hexadecimal and Binary
This is where hex really shines! Each hex digit corresponds to exactly 4 binary digits.
Example: Convert 2A3F to binary.
Break it down digit by digit:
-
2 = 0010
-
A = 1010
-
3 = 0011
-
F = 1111
Combine: 0010 1010 0011 1111 or 0010101000111111 (16 bits)
Example: Convert binary 110110101001 to hex.
First, group binary into 4-bit chunks from the right, padding with zeros on the left if needed:
-
1101 1010 1001 (already in groups of 4)
-
1101 = D
-
1010 = A
-
1001 = 9
Result: DA9
In Python:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<span class="token comment"># Binary to hex</span> binary_str <span class="token operator">=</span> <span class="token string">"110110101001"</span> decimal <span class="token operator">=</span> <span class="token builtin">int</span><span class="token punctuation">(</span>binary_str<span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span> hex_result <span class="token operator">=</span> <span class="token builtin">hex</span><span class="token punctuation">(</span>decimal<span class="token punctuation">)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"Binary </span><span class="token interpolation"><span class="token punctuation">{</span>binary_str<span class="token punctuation">}</span></span><span class="token string"> = hex </span><span class="token interpolation"><span class="token punctuation">{</span>hex_result<span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span> <span class="token comment"># Hex to binary</span> hex_str <span class="token operator">=</span> <span class="token string">"DA9"</span> decimal <span class="token operator">=</span> <span class="token builtin">int</span><span class="token punctuation">(</span>hex_str<span class="token punctuation">,</span> <span class="token number">16</span><span class="token punctuation">)</span> binary_result <span class="token operator">=</span> <span class="token builtin">bin</span><span class="token punctuation">(</span>decimal<span class="token punctuation">)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"Hex </span><span class="token interpolation"><span class="token punctuation">{</span>hex_str<span class="token punctuation">}</span></span><span class="token string"> = binary </span><span class="token interpolation"><span class="token punctuation">{</span>binary_result<span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span> |
Part 5: Hexadecimal in Programming Languages
Literals and Notation
Different programming languages use different prefixes for hexadecimal literals:
|
0 1 2 3 4 5 6 7 8 |
<span class="token comment"># Python</span> hex_num <span class="token operator">=</span> <span class="token number">0xFF</span> <span class="token keyword">print</span><span class="token punctuation">(</span>hex_num<span class="token punctuation">)</span> <span class="token comment"># 255</span> |
|
0 1 2 3 4 5 6 7 8 |
<span class="token comment">// JavaScript</span> <span class="token keyword">let</span> hexNum <span class="token operator">=</span> <span class="token number">0xFF</span><span class="token punctuation">;</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>hexNum<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 255</span> |
|
0 1 2 3 4 5 6 7 8 |
<span class="token comment">// Java</span> <span class="token keyword">int</span> hexNum <span class="token operator">=</span> <span class="token number">0xFF</span><span class="token punctuation">;</span> <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>hexNum<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 255</span> |
|
0 1 2 3 4 5 6 7 8 |
<span class="token comment">// C/C++</span> <span class="token keyword">int</span> hexNum <span class="token operator">=</span> <span class="token number">0xFF</span><span class="token punctuation">;</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> hexNum<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 255</span> |
|
0 1 2 3 4 5 6 7 8 |
<span class="token comment"># R doesn't have hex literals, but can convert</span> hex_num <span class="token operator"><-</span> as.hexmode<span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>hex_num<span class="token punctuation">)</span> <span class="token comment"># ff</span> |
Common Uses
1. Memory Addresses
When debugging, you’ll often see memory addresses in hex:
|
0 1 2 3 4 5 6 7 8 |
<span class="token comment"># Get the memory address of a variable (implementation dependent)</span> x <span class="token operator">=</span> <span class="token number">42</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"Variable x is at memory address: </span><span class="token interpolation"><span class="token punctuation">{</span><span class="token builtin">hex</span><span class="token punctuation">(</span><span class="token builtin">id</span><span class="token punctuation">(</span>x<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span> |
2. Color Codes in Web Development
Colors in HTML/CSS are often specified in hex:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<span class="token comment">/* CSS color examples */</span> <span class="token selector">body</span> <span class="token punctuation">{</span> <span class="token property">background-color</span><span class="token punctuation">:</span> #FFFFFF<span class="token punctuation">;</span> <span class="token comment">/* White */</span> <span class="token property">color</span><span class="token punctuation">:</span> #000000<span class="token punctuation">;</span> <span class="token comment">/* Black */</span> <span class="token punctuation">}</span> <span class="token selector">h1</span> <span class="token punctuation">{</span> <span class="token property">color</span><span class="token punctuation">:</span> #FF5733<span class="token punctuation">;</span> <span class="token comment">/* A shade of orange */</span> <span class="token punctuation">}</span> <span class="token selector">.highlight</span> <span class="token punctuation">{</span> <span class="token property">background-color</span><span class="token punctuation">:</span> #FFFF00<span class="token punctuation">;</span> <span class="token comment">/* Yellow */</span> <span class="token punctuation">}</span> |
Each pair of hex digits represents the intensity of Red, Green, and Blue:
-
#FF0000= Red (255, 0, 0) -
#00FF00= Green (0, 255, 0) -
#0000FF= Blue (0, 0, 255) -
#FFFFFF= White (255, 255, 255) -
#000000= Black (0, 0, 0)
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<span class="token comment"># Working with hex colors in Python</span> <span class="token keyword">def</span> <span class="token function">hex_to_rgb</span><span class="token punctuation">(</span>hex_color<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token triple-quoted-string string">"""Convert hex color (like '#FFA500') to RGB tuple."""</span> hex_color <span class="token operator">=</span> hex_color<span class="token punctuation">.</span>lstrip<span class="token punctuation">(</span><span class="token string">'#'</span><span class="token punctuation">)</span> r <span class="token operator">=</span> <span class="token builtin">int</span><span class="token punctuation">(</span>hex_color<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">:</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token number">16</span><span class="token punctuation">)</span> g <span class="token operator">=</span> <span class="token builtin">int</span><span class="token punctuation">(</span>hex_color<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">:</span><span class="token number">4</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token number">16</span><span class="token punctuation">)</span> b <span class="token operator">=</span> <span class="token builtin">int</span><span class="token punctuation">(</span>hex_color<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">:</span><span class="token number">6</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token number">16</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token punctuation">(</span>r<span class="token punctuation">,</span> g<span class="token punctuation">,</span> b<span class="token punctuation">)</span> <span class="token keyword">def</span> <span class="token function">rgb_to_hex</span><span class="token punctuation">(</span>r<span class="token punctuation">,</span> g<span class="token punctuation">,</span> b<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token triple-quoted-string string">"""Convert RGB tuple to hex color."""</span> <span class="token keyword">return</span> <span class="token string-interpolation"><span class="token string">f"#</span><span class="token interpolation"><span class="token punctuation">{</span>r<span class="token punctuation">:</span><span class="token format-spec">02X</span><span class="token punctuation">}</span></span><span class="token interpolation"><span class="token punctuation">{</span>g<span class="token punctuation">:</span><span class="token format-spec">02X</span><span class="token punctuation">}</span></span><span class="token interpolation"><span class="token punctuation">{</span>b<span class="token punctuation">:</span><span class="token format-spec">02X</span><span class="token punctuation">}</span></span><span class="token string">"</span></span> orange_hex <span class="token operator">=</span> <span class="token string">"#FFA500"</span> orange_rgb <span class="token operator">=</span> hex_to_rgb<span class="token punctuation">(</span>orange_hex<span class="token punctuation">)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"</span><span class="token interpolation"><span class="token punctuation">{</span>orange_hex<span class="token punctuation">}</span></span><span class="token string"> = RGB</span><span class="token interpolation"><span class="token punctuation">{</span>orange_rgb<span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span> back_to_hex <span class="token operator">=</span> rgb_to_hex<span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">,</span> <span class="token number">165</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"RGB(255,165,0) = </span><span class="token interpolation"><span class="token punctuation">{</span>back_to_hex<span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span> |
3. Character Codes
ASCII and Unicode values are often shown in hex:
|
0 1 2 3 4 5 6 7 8 9 10 |
<span class="token comment"># Show ASCII values in hex</span> text <span class="token operator">=</span> <span class="token string">"Hello"</span> <span class="token keyword">for</span> char <span class="token keyword">in</span> text<span class="token punctuation">:</span> ascii_val <span class="token operator">=</span> <span class="token builtin">ord</span><span class="token punctuation">(</span>char<span class="token punctuation">)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"'</span><span class="token interpolation"><span class="token punctuation">{</span>char<span class="token punctuation">}</span></span><span class="token string">': decimal </span><span class="token interpolation"><span class="token punctuation">{</span>ascii_val<span class="token punctuation">:</span><span class="token format-spec">3</span><span class="token punctuation">}</span></span><span class="token string">, hex </span><span class="token interpolation"><span class="token punctuation">{</span>ascii_val<span class="token punctuation">:</span><span class="token format-spec">02X</span><span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span> |
Output:
|
0 1 2 3 4 5 6 7 8 9 10 |
'H': decimal 72, hex 48 'e': decimal 101, hex 65 'l': decimal 108, hex 6C 'l': decimal 108, hex 6C 'o': decimal 111, hex 6F |
4. File Signatures (Magic Numbers)
File formats often start with specific hex sequences called “magic numbers” that identify the file type:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<span class="token comment"># Common file signatures in hex</span> file_signatures <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token string">"PDF"</span><span class="token punctuation">:</span> <span class="token string">"25504446"</span><span class="token punctuation">,</span> <span class="token comment"># %PDF</span> <span class="token string">"PNG"</span><span class="token punctuation">:</span> <span class="token string">"89504E47"</span><span class="token punctuation">,</span> <span class="token comment"># PNG signature</span> <span class="token string">"JPEG"</span><span class="token punctuation">:</span> <span class="token string">"FFD8FF"</span><span class="token punctuation">,</span> <span class="token comment"># JPEG SOI marker</span> <span class="token string">"ZIP"</span><span class="token punctuation">:</span> <span class="token string">"504B0304"</span><span class="token punctuation">,</span> <span class="token comment"># PKZIP</span> <span class="token string">"GIF"</span><span class="token punctuation">:</span> <span class="token string">"47494638"</span><span class="token punctuation">,</span> <span class="token comment"># GIF</span> <span class="token punctuation">}</span> <span class="token keyword">for</span> file_type<span class="token punctuation">,</span> signature <span class="token keyword">in</span> file_signatures<span class="token punctuation">.</span>items<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"</span><span class="token interpolation"><span class="token punctuation">{</span>file_type<span class="token punctuation">}</span></span><span class="token string">: 0x</span><span class="token interpolation"><span class="token punctuation">{</span>signature<span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span> |
5. Bit Manipulation
Hexadecimal is often used in bit manipulation because each digit represents exactly 4 bits:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<span class="token comment"># Using hex masks for bit operations</span> READ <span class="token operator">=</span> <span class="token number">0x4</span> <span class="token comment"># 0100 in binary</span> WRITE <span class="token operator">=</span> <span class="token number">0x2</span> <span class="token comment"># 0010</span> EXECUTE <span class="token operator">=</span> <span class="token number">0x1</span> <span class="token comment"># 0001</span> permissions <span class="token operator">=</span> READ <span class="token operator">|</span> WRITE <span class="token comment"># 0x6 (0110)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"Permissions: </span><span class="token interpolation"><span class="token punctuation">{</span><span class="token builtin">bin</span><span class="token punctuation">(</span>permissions<span class="token punctuation">)</span><span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span> <span class="token comment"># Check if write permission is set</span> <span class="token keyword">if</span> permissions <span class="token operator">&</span> WRITE<span class="token punctuation">:</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"Write permission granted"</span><span class="token punctuation">)</span> |
Part 6: Hexadecimal Arithmetic
Addition
Adding hex numbers is like decimal addition, but you carry when you reach 16 instead of 10.
Example: Add A5 + 3F
|
0 1 2 3 4 5 6 7 8 |
A 5 + 3 F ----- |
-
Rightmost column: 5 + F (15) = 20 decimal. 20 in hex is 14 (since 16 + 4). Write 4, carry 1.
-
Next column: 1 (carry) + A (10) + 3 = 14 decimal. 14 in hex is E.
Result: E4
|
0 1 2 3 4 5 6 7 8 9 |
a <span class="token operator">=</span> <span class="token number">0xA5</span> b <span class="token operator">=</span> <span class="token number">0x3F</span> result <span class="token operator">=</span> a <span class="token operator">+</span> b <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"</span><span class="token interpolation"><span class="token punctuation">{</span><span class="token builtin">hex</span><span class="token punctuation">(</span>a<span class="token punctuation">)</span><span class="token punctuation">}</span></span><span class="token string"> + </span><span class="token interpolation"><span class="token punctuation">{</span><span class="token builtin">hex</span><span class="token punctuation">(</span>b<span class="token punctuation">)</span><span class="token punctuation">}</span></span><span class="token string"> = </span><span class="token interpolation"><span class="token punctuation">{</span><span class="token builtin">hex</span><span class="token punctuation">(</span>result<span class="token punctuation">)</span><span class="token punctuation">}</span></span><span class="token string"> (</span><span class="token interpolation"><span class="token punctuation">{</span>result<span class="token punctuation">}</span></span><span class="token string">)"</span></span><span class="token punctuation">)</span> |
Subtraction
Similar to decimal subtraction, borrowing when needed.
Example: Subtract 3F from E4
|
0 1 2 3 4 5 6 7 8 |
E 4 - 3 F ----- |
-
Rightmost column: 4 – F (15) → need to borrow. Borrow 1 from the left, making the right column 14 (hex). 14 – 15? Wait, that’s still negative. Let’s do it carefully.
Better to convert to decimal: E4 = 228, 3F = 63, 228 – 63 = 165 = A5 in hex.
Part 7: Common Hexadecimal Values to Know
Some hex values you’ll encounter frequently:
| Hex | Decimal | Binary | Common Use |
|---|---|---|---|
| 0x0 | 0 | 0000 | Zero, false |
| 0x1 | 1 | 0001 | One, true |
| 0xF | 15 | 1111 | Maximum for 4 bits |
| 0xFF | 255 | 11111111 | Maximum byte value |
| 0xFFFF | 65535 | 16 bits of 1s | Maximum 16-bit value |
| 0x7F | 127 | 01111111 | Maximum positive signed byte |
| 0x80 | 128 | 10000000 | Minimum negative signed byte (in two’s complement) |
| 0xA | 10 | 1010 | Decimal 10 |
| 0x10 | 16 | 00010000 | One 16 (like decimal’s 10) |
Part 8: Practical Exercises
Exercise 1: Color Converter
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<span class="token keyword">def</span> <span class="token function">analyze_color</span><span class="token punctuation">(</span>hex_color<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token triple-quoted-string string">"""Analyze an RGB hex color."""</span> hex_color <span class="token operator">=</span> hex_color<span class="token punctuation">.</span>lstrip<span class="token punctuation">(</span><span class="token string">'#'</span><span class="token punctuation">)</span> r <span class="token operator">=</span> <span class="token builtin">int</span><span class="token punctuation">(</span>hex_color<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">:</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token number">16</span><span class="token punctuation">)</span> g <span class="token operator">=</span> <span class="token builtin">int</span><span class="token punctuation">(</span>hex_color<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">:</span><span class="token number">4</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token number">16</span><span class="token punctuation">)</span> b <span class="token operator">=</span> <span class="token builtin">int</span><span class="token punctuation">(</span>hex_color<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">:</span><span class="token number">6</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token number">16</span><span class="token punctuation">)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"Color: #</span><span class="token interpolation"><span class="token punctuation">{</span>hex_color<span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"RGB: (</span><span class="token interpolation"><span class="token punctuation">{</span>r<span class="token punctuation">}</span></span><span class="token string">, </span><span class="token interpolation"><span class="token punctuation">{</span>g<span class="token punctuation">}</span></span><span class="token string">, </span><span class="token interpolation"><span class="token punctuation">{</span>b<span class="token punctuation">}</span></span><span class="token string">)"</span></span><span class="token punctuation">)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"Binary: R=</span><span class="token interpolation"><span class="token punctuation">{</span>r<span class="token punctuation">:</span><span class="token format-spec">08b</span><span class="token punctuation">}</span></span><span class="token string"> G=</span><span class="token interpolation"><span class="token punctuation">{</span>g<span class="token punctuation">:</span><span class="token format-spec">08b</span><span class="token punctuation">}</span></span><span class="token string"> B=</span><span class="token interpolation"><span class="token punctuation">{</span>b<span class="token punctuation">:</span><span class="token format-spec">08b</span><span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span> <span class="token comment"># Determine brightness</span> brightness <span class="token operator">=</span> <span class="token punctuation">(</span>r <span class="token operator">*</span> <span class="token number">299</span> <span class="token operator">+</span> g <span class="token operator">*</span> <span class="token number">587</span> <span class="token operator">+</span> b <span class="token operator">*</span> <span class="token number">114</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">1000</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"Brightness: </span><span class="token interpolation"><span class="token punctuation">{</span>brightness<span class="token punctuation">:</span><span class="token format-spec">.1f</span><span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"Perceived as: </span><span class="token interpolation"><span class="token punctuation">{</span><span class="token string">'Light'</span> <span class="token keyword">if</span> brightness <span class="token operator">></span> <span class="token number">128</span> <span class="token keyword">else</span> <span class="token string">'Dark'</span><span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span> <span class="token comment"># Test with some colors</span> analyze_color<span class="token punctuation">(</span><span class="token string">"#FF5733"</span><span class="token punctuation">)</span> analyze_color<span class="token punctuation">(</span><span class="token string">"#3366FF"</span><span class="token punctuation">)</span> |
Exercise 2: Memory Dump Viewer
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<span class="token keyword">def</span> <span class="token function">hex_dump</span><span class="token punctuation">(</span>data<span class="token punctuation">,</span> bytes_per_line<span class="token operator">=</span><span class="token number">16</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token triple-quoted-string string">"""Create a simple hex dump of binary data."""</span> <span class="token keyword">for</span> i <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token builtin">len</span><span class="token punctuation">(</span>data<span class="token punctuation">)</span><span class="token punctuation">,</span> bytes_per_line<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token comment"># Address</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"</span><span class="token interpolation"><span class="token punctuation">{</span>i<span class="token punctuation">:</span><span class="token format-spec">04X</span><span class="token punctuation">}</span></span><span class="token string">: "</span></span><span class="token punctuation">,</span> end<span class="token operator">=</span><span class="token string">""</span><span class="token punctuation">)</span> <span class="token comment"># Hex bytes</span> chunk <span class="token operator">=</span> data<span class="token punctuation">[</span>i<span class="token punctuation">:</span>i<span class="token operator">+</span>bytes_per_line<span class="token punctuation">]</span> hex_bytes <span class="token operator">=</span> <span class="token string">' '</span><span class="token punctuation">.</span>join<span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"</span><span class="token interpolation"><span class="token punctuation">{</span>b<span class="token punctuation">:</span><span class="token format-spec">02X</span><span class="token punctuation">}</span></span><span class="token string">"</span></span> <span class="token keyword">for</span> b <span class="token keyword">in</span> chunk<span class="token punctuation">)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"</span><span class="token interpolation"><span class="token punctuation">{</span>hex_bytes<span class="token punctuation">:</span><span class="token operator"><</span><span class="token punctuation">{</span>bytes_per_line<span class="token operator">*</span><span class="token number">3</span><span class="token punctuation">}</span><span class="token punctuation">}</span></span><span class="token string"> "</span></span><span class="token punctuation">,</span> end<span class="token operator">=</span><span class="token string">""</span><span class="token punctuation">)</span> <span class="token comment"># ASCII representation</span> ascii_chars <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">.</span>join<span class="token punctuation">(</span><span class="token builtin">chr</span><span class="token punctuation">(</span>b<span class="token punctuation">)</span> <span class="token keyword">if</span> <span class="token number">32</span> <span class="token operator"><=</span> b <span class="token operator"><=</span> <span class="token number">126</span> <span class="token keyword">else</span> <span class="token string">'.'</span> <span class="token keyword">for</span> b <span class="token keyword">in</span> chunk<span class="token punctuation">)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f" </span><span class="token interpolation"><span class="token punctuation">{</span>ascii_chars<span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span> <span class="token comment"># Example: dump a string as bytes</span> text <span class="token operator">=</span> <span class="token string">"Hello, Hexadecimal World!"</span> data <span class="token operator">=</span> text<span class="token punctuation">.</span>encode<span class="token punctuation">(</span><span class="token string">'ascii'</span><span class="token punctuation">)</span> hex_dump<span class="token punctuation">(</span>data<span class="token punctuation">)</span> |
Exercise 3: Bitmask Viewer
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<span class="token keyword">def</span> <span class="token function">show_bitmask</span><span class="token punctuation">(</span>value<span class="token punctuation">,</span> bits<span class="token operator">=</span><span class="token number">16</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token triple-quoted-string string">"""Display a number in hex, decimal, and binary."""</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"Decimal: </span><span class="token interpolation"><span class="token punctuation">{</span>value<span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"Hex: </span><span class="token interpolation"><span class="token punctuation">{</span>value<span class="token punctuation">:</span><span class="token comment">#0{bits//4+2}X}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"Binary: </span><span class="token interpolation"><span class="token punctuation">{</span><span class="token builtin">format</span><span class="token punctuation">(</span>value<span class="token punctuation">,</span> <span class="token string">f'0</span><span class="token punctuation">{</span>bits<span class="token punctuation">}</span><span class="token string">b'</span><span class="token punctuation">)</span><span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"-"</span> <span class="token operator">*</span> <span class="token number">40</span><span class="token punctuation">)</span> <span class="token comment"># Test with various values</span> show_bitmask<span class="token punctuation">(</span><span class="token number">0xABCD</span><span class="token punctuation">)</span> show_bitmask<span class="token punctuation">(</span><span class="token number">0b1010101010101010</span><span class="token punctuation">)</span> show_bitmask<span class="token punctuation">(</span><span class="token number">0xFF00</span><span class="token punctuation">)</span> |
Summary: The Hexadecimal Philosophy
-
Hexadecimal is a base-16 number system using digits 0-9 and letters A-F.
-
One hex digit represents exactly 4 bits (a nibble), making it a perfect shorthand for binary.
-
Conversion between hex and binary is trivial—just translate each hex digit to/from 4 bits.
-
Common uses include memory addresses, color codes, character encoding, file signatures, and bit manipulation.
-
In most programming languages, hex literals are written with a
0xprefix (e.g.,0xFF). -
Hexadecimal arithmetic works like decimal but carries at 16 instead of 10.
Hexadecimal is one of the programmer’s most trusted tools. It sits perfectly between the binary world of machines and the decimal world of humans, making it indispensable for systems programming, debugging, and any work that requires peeking under the hood of your computer.
