Source: http://www.robotroom.com/
Number Systems
There are infinite ways to represent a number. The four commonly associated with modern computers and digital electronics are: decimal, binary, octal, and hexadecimal.
Decimal (base 10) is the way most human beings represent numbers. Decimal is sometimes abbreviated as dec.
Decimal counting goes:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, and so on.
Binary (base 2) is the natural way most digital circuits represent and manipulate numbers. (Common misspellings are “bianary”, “bienary”, or “binery”.) Binary numbers are sometimes represented by preceding the value with '0b', as in 0b1011. Binary is sometimes abbreviated as bin.
Binary counting goes:
0, 1, 10, 11, 100, 101, 110, 111, 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111, 10000, 10001, and so on.
Octal (base 8) was previously a popular choice for representing digital circuit numbers in a form that is more compact than binary. Octal is sometimes abbreviated as oct.
Octal counting goes:
0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 16, 17, 20, 21, and so on.
Hexadecimal (base 16) is currently the most popular choice for representing digital circuit numbers in a form that is more compact than binary. (Common misspellings are “hexdecimal”, “hexidecimal”, “hexedecimal”, or “hexodecimal”.) Hexadecimal numbers are sometimes represented by preceding the value with '0x', as in 0x1B84. Hexadecimal is sometimes abbreviated as hex.
Hexadecimal counting goes:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, 10, 11, and so on.
[ad id="13280"]
All four number systems are equally capable of representing any number. Furthermore, a number can be perfectly converted between the various number systems without any loss of numeric value.
At first blush, it seems like using any number system other than human-centric decimal is complicated and unnecessary. However, since the job of electrical and software engineers is to work with digital circuits, engineers require number systems that can best transfer information between the human world and the digital circuit world.
It turns out that the way in which a number is represented can make it easier for the engineer to perceive the meaning of the number as it applies to a digital circuit. In other words, the appropriate number system can actually make things less complicated.
Fundamental Information Element of Digital Circuits
Almost all modern digital circuits are based on two-state switches. The switches are either on or off. It doesn’t matter if the switches are actually physical switches, vacuum tubes, relays, or transistors. And, it doesn’t matter if the 'on' state is represented by 1.8 V on a cutting-edge CPU core, -12 V on a RS-232 interface chip, or 5 V on a classic TTL logic chip.
Because the fundamental information element of digital circuits has two states, it is most naturally represented by a number system where each individual digit has two states: binary.
For example, switches that are 'on' are represented by '1' and switches that are 'off' are represented by '0'. It is easy to instantly comprehend the values of 8 switches represented in binary as 10001101. It is also easy to build a circuit to display each switch state in binary, by having an LED (lit or unlit) for each binary digit.
Making Values More Compact
“Binary digit” is a little unwieldy to say over and over, so the term was contracted to “bit”. Not only is the term “binary digit” a little unwieldy, but so is the length of a binary number, since each digit can only represent one switch. As digital circuits grew more complex, a more compact form of representing circuit information became necessary.
An octal number (base 8) can be up to 1/3 the length of a binary number (base 2). 8 is a whole power of 2 (23=8). That means three binary digits convert neatly into one octal digit.
A hexadecimal number (base 16) can be up to 1/4 the length of a binary number. 16 is a whole power of 2 (24=16). That means four binary digits convert neatly into one hexadecimal digit.
Unfortunately, decimal (base 10) is not a whole power of 2. So, it is not possible to simply chunk groups of binary digits to convert the raw state of a digital circuit into the human-centric format.
Let’s see how to convert a number from binary.
[incor name="2. Binary Number Conversion"]
2. Binary Number Conversion
Binary to Octal
An easy way to convert from binary to octal is to group binary digits into sets of three, starting with the least significant (rightmost) digits.
Binary: 11100101 = | 11 100 101 | |
011 100 101 | Pad the most significant digits with zeros if necessary to complete a group of three. |
Then, look up each group in a table:
Binary: | 000 | 001 | 010 | 011 | 100 | 101 | 110 | 111 |
Octal: | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
Binary = | 011 | 100 | 101 | |
Octal = | 3 | 4 | 5 | = 345 oct |
Binary to Hexadecimal
An equally easy way to convert from binary to hexadecimal is to group binary digits into sets of four, starting with the least significant (rightmost) digits.
Binary: 11100101 = 1110 0101
Then, look up each group in a table:
Binary: | 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 |
Hexadecimal: | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
Binary: | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 |
Hexadecimal: | 8 | 9 | A | B | C | D | E | F |
Binary = | 1110 | 0101 | |
Hexadecimal = | E | 5 | = E5 hex |
[ad id="13280"]
Binary to Decimal
They say there are only 10 people in this world: those that understand binary and those that don’t. Ha ha.
If you don’t get that joke, you'll need a method to convert from binary to decimal. One method involves addition and multiplication.
- Start the decimal result at 0.
- Remove the most significant binary digit (leftmost) and add it to the result.
- If all binary digits have been removed, you’re done. Stop.
- Otherwise, multiply the result by 2.
- Go to step 2.
[ad id="13280"]
Here is an example of converting 11100000000 binary to decimal:
Binary Digits | Operation | Decimal Result | Operation | Decimal Result |
11100000000 | +1 | 1 | × 2 | 2 |
1100000000 | +1 | 3 | × 2 | 6 |
100000000 | +1 | 7 | × 2 | 14 |
00000000 | +0 | 14 | × 2 | 28 |
0000000 | +0 | 28 | × 2 | 56 |
000000 | +0 | 56 | × 2 | 112 |
00000 | +0 | 112 | × 2 | 224 |
0000 | +0 | 224 | × 2 | 448 |
000 | +0 | 448 | × 2 | 896 |
00 | +0 | 896 | × 2 | 1792 |
0 | +0 | 1792 | done. |
Let’s try converting from decimal
3. Decimal Number Conversion
A repeated division and remainder algorithm can convert decimal to binary, octal, or hexadecimal.
- Divide the decimal number by the desired target radix (2, 8, or 16).
- Append the remainder as the next most significant digit.
- Repeat until the decimal number has reached zero.
Decimal to Binary
Here is an example of using repeated division to convert 1792 decimal to binary:
Decimal Number | Operation | Quotient | Remainder | Binary Result | |
1792 | ÷ 2 = | 896 | 0 | 0 | |
896 | ÷ 2 = | 448 | 0 | 00 | |
448 | ÷ 2 = | 224 | 0 | 000 | |
224 | ÷ 2 = | 112 | 0 | 0000 | |
112 | ÷ 2 = | 56 | 0 | 00000 | |
56 | ÷ 2 = | 28 | 0 | 000000 | |
28 | ÷ 2 = | 14 | 0 | 0000000 | |
14 | ÷ 2 = | 7 | 0 | 00000000 | |
7 | ÷ 2 = | 3 | 1 | 100000000 | |
3 | ÷ 2 = | 1 | 1 | 1100000000 | |
1 | ÷ 2 = | 0 | 1 | 11100000000 | |
0 | done. |
Decimal to Octal
Here is an example of using repeated division to convert 1792 decimal to octal:
Decimal Number | Operation | Quotient | Remainder | Octal Result | |
1792 | ÷ 8 = | 224 | 0 | 0 | |
224 | ÷ 8 = | 28 | 0 | 00 | |
28 | ÷ 8 = | 3 | 4 | 400 | |
3 | ÷ 8 = | 0 | 3 | 3400 | |
0 | done. |
Decimal to Hexadecimal
Here is an example of using repeated division to convert 1792 decimal to hexadecimal:
Decimal Number | Operation | Quotient | Remainder | Hexadecimal Result | |
1792 | ÷ 16 = | 112 | 0 | 0 | |
112 | ÷ 16 = | 7 | 0 | 00 | |
7 | ÷ 16 = | 0 | 7 | 700 | |
0 | done. |
The only addition to the algorithm when converting from decimal to hexadecimal is that a table must be used to obtain the hexadecimal digit if the remainder is greater than decimal 9.
Decimal: | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
Hexadecimal: | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
Decimal: | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
Hexadecimal: | 8 | 9 | A | B | C | D | E | F |
[ad id="13279"]
The addition of letters can make for funny hexadecimal values. For example, 48879 decimal converted to hex is:
Decimal Number | Operation | Quotient | Remainder | Hexadecimal Result | |
48879 | ÷ 16 = | 3054 | 15 | F | |
3054 | ÷ 16 = | 190 | 14 | EF | |
190 | ÷ 16 = | 11 | 14 | EEF | |
11 | ÷ 16 = | 0 | 11 | BEEF | |
0 | done. |
Other fun hexadecimal numbers include: AD, BE, FAD, FADE, ADD, BED, BEE, BEAD, DEAF, FEE, ODD, BOD, DEAD, DEED, BABE, CAFE, C0FFEE, FED, FEED, FACE, BAD, F00D, and my initials DAC.
Now on to octal conversions...
4. Octal Number Conversion
Octal to Binary
Converting from octal to binary is as easy as converting from binary to octal. Simply look up each octal digit to obtain the equivalent group of three binary digits.
Octal: | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
Binary: | 000 | 001 | 010 | 011 | 100 | 101 | 110 | 111 |
Octal = | 3 | 4 | 5 | |
Binary = | 011 | 100 | 101 | = 011100101 binary |
Octal to Hexadecimal
When converting from octal to hexadecimal, it is often easier to first convert the octal number into binary and then from binary into hexadecimal. For example, to convert 345 octal into hex:
(from the previous example)
Octal = | 3 | 4 | 5 | |
Binary = | 011 | 100 | 101 | = 011100101 binary |
Drop any leading zeros or pad with leading zeros to get groups of four binary digits (bits):
Binary 011100101 = 1110 0101
Then, look up the groups in a table to convert to hexadecimal digits.
Binary: | 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 |
Hexadecimal: | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
Binary: | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 |
Hexadecimal: | 8 | 9 | A | B | C | D | E | F |
Binary = | 1110 | 0101 | |
Hexadecimal = | E | 5 | = E5 hex |
Therefore, through a two-step conversion process, octal 345 equals binary 011100101 equals hexadecimal E5.
[ad id="13280"]
Octal to Decimal
Converting octal to decimal can be done with repeated division.
- Start the decimal result at 0.
- Remove the most significant octal digit (leftmost) and add it to the result.
- If all octal digits have been removed, you’re done. Stop.
- Otherwise, multiply the result by 8.
- Go to step 2.
Octal Digits | Operation | Decimal Result | Operation | Decimal Result |
345 | +3 | 3 | × 8 | 24 |
45 | +4 | 28 | × 8 | 224 |
5 | +5 | 229 | done. |
The conversion can also be performed in the conventional mathematical way, by showing each digit place as an increasing power of 8.
345 octal = (3 * 82) + (4 * 81) + (5 * 80) = (3 * 64) + (4 * 8) + (5 * 1) = 229 decimal
Converting from hexadecimal is next...
5. Hexadecimal Number Conversion
Hexadecimal to Binary
Converting from hexadecimal to binary is as easy as converting from binary to hexadecimal. Simply look up each hexadecimal digit to obtain the equivalent group of four binary digits.
Hexadecimal: | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
Binary: | 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 |
Hexadecimal: | 8 | 9 | A | B | C | D | E | F |
Binary: | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 |
Hexadecimal = | A | 2 | D | E | |
Binary = | 1010 | 0010 | 1101 | 1110 | = 1010001011011110 binary |
Hexadecimal to Octal
When converting from hexadecimal to octal, it is often easier to first convert the hexadecimal number into binary and then from binary into octal. For example, to convert A2DE hex into octal:
(from the previous example)
Hexadecimal = | A | 2 | D | E | |
Binary = | 1010 | 0010 | 1101 | 1110 | = 1010001011011110 binary |
Add leading zeros or remove leading zeros to group into sets of three binary digits.
Binary: 1010001011011110 = 001 010 001 011 011 110
Then, look up each group in a table:
Binary: | 000 | 001 | 010 | 011 | 100 | 101 | 110 | 111 |
Octal: | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
Binary = | 001 | 010 | 001 | 011 | 011 | 110 | |
Octal = | 1 | 2 | 1 | 3 | 3 | 6 | = 121336 octal |
Therefore, through a two-step conversion process, hexadecimal A2DE equals binary 1010001011011110 equals octal 121336.
[ad id="13279"]
Hexadecimal to Decimal
Converting hexadecimal to decimal can be performed in the conventional mathematical way, by showing each digit place as an increasing power of 16. Of course, hexadecimal letter values need to be converted to decimal values before performing the math.
Hexadecimal: | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
Decimal: | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
Hexadecimal: | 8 | 9 | A | B | C | D | E | F |
Decimal: | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
A2DE hexadecimal:
= ((A) * 163) + (2 * 162) + ((D) * 161) + ((E) * 160)
= (10 * 163) + (2 * 162) + (13 * 161) + (14 * 160)
= (10 * 4096) + (2 * 256) + (13 * 16) + (14 * 1)
= 40960 + 512 + 208 + 14
= 41694 decimal
Finally, why you might choose one number system over another...
6. Selecting a Numbering System
The appropriate numbering system to represent a value depends on the application. There are advantages and disadvantages to each numbering system.
When interfacing with non-engineers, decimal remains the numbering system of choice. For example, I’d have heart attack if the IRS told me that I owed them 1000000 dollars, when they actually meant to say 64 decimal.
Modern computers have lots of memory and disk space for programs. However, many low-end microcontrollers can be quite tight on space. Outputting a decimal value to a serial port or display requires the number be divided by 10 to break off each digit. Depending on the capabilities of the microcontroller, the divide-by-ten routine alone can take up more room than an entire hexadecimal output routine!
[ad id="13280"]
When diagnosing an output pin logic problem, it isn’t immediately helpful to see that the microcontroller’s port B is set to 180 decimal. I’d prefer to see the pins as 10110100 binary. The same thing is true when looking at bit flags in memory. A disadvantage of binary is that it gets lengthy fairly quickly.
When debugging dumps of memory, disks, or data streams on modern microcontroller and computers, hexadecimal provides a compact format that is easy to break into bytes and convert into bits. In my software career, I routine examine lengthy log files detailing all the bytes sent over the air on the wireless networks.
Octal has fallen out of usage over the last thirty years due to microprocessors and microcontrollers processing data in bit chunks that are not evenly divisible by 3 (4-bit, 8-bit, 16-bit, 32-bit, 64-bit) . Octal does have the advantage of requiring only number symbols (0-8), as opposed to hexadecimal (0-9, A-F). So, octal still finds some limited usage on numeric-only displays.
To summarize, I switch between using binary, decimal, and hexadecimal on a regular basis, depending which format most clearly expresses the data that the number represents.
comment 0 Comments
more_vert