
Understanding Different Base Systems
This essay is targeted at new students of computer programming or computer
science who want to understand how base two (binary), base eight (octal), and
base sixteen (hexadecimal) work.
First of all, it's important to realize that each of these base systems is just another way of writing down the same number. When you convert a number
between different bases, it should still have the same value. In this essay,
when I want to refer to the actual value of a number (regardless of its base),
I'll do it in base 10 because that's what most people are used to.
It's generally easiest to understand the concept of different bases by looking
at base 10. When we have a number in base 10, each digit can be referred to as
the ones digit, tens digit, the hundreds digit, the thousands digit, or so
forth. For instance, in the number 432, 4 is the hundreds digit, 3 is the tens
digit, and 2 is the ones digit.
Another way to think about this is to rewrite 432 as
4 x 10^{2}
+ 3 x 10^{1}
+ 2 x 10^{0}
Each digit is multiplied by the next power of ten. Numbers in other bases, such as base 16, are merely numbers where the base is not ten! For instance, we could interpret 432 as though it were in base 16 by evaluating it as
4 x 16^{2}
+ 3 x 16^{1}
+ 2 x 10^{0}
This would be the same as the number 1074 in base 10.
So to convert a number from a given base into base 10, all we need to do is
treat each place as a power of the given base times the value of the digit in
that place. Note that customarily for a given base, only digits from 0 to the
base minus one are used. For instance, in decimal, we only use the digits 0
through 9. That's because we don't need any more digits to express every
possible number. (But we do need at least that many; if we only had 8 digits,
how would we ever express the value 9?)
Now, bases greater than 10 will require more than 10 possible digits. For
intsance, the number 11 in base ten can be expressed in base 16 with only a
single digit because the ones place in base 16 can range from 0 to 15. Since
we only have 10 digits, the letters A through F are used to stand for the
"digits" 10 through 15. So, for instance, the hexadecimal number B stands for
the decimal number 11.
Bases less than ten will require fewer digitsfor instance, binary, which works using powers of two, only needs two digits: one and zero. The binary number 1001, for instance, is the same as writing
1 * 2^{3}
1 * 2^{2}
1 * 2^{1}
1 * 2^{0}
which comes out to the decimal value 9.
Numbers written in octal use a base of 8 instead of 2 or 16. See if you can figure out what the number 20 written in octal would be in base ten.
Because octal, hexadecimal, and decimal numbers can often share the same
digits, there needs to be some way of distinguishing between them.
Traditionally, octal numbers are written with a leading 0; for instance, 020 is
the same thing as the number 20 in base 8. Hexadecimal numbers are written with
the prefix of "0x". So 0x20 would be the number 20 in base 16; we'd interpret
it the same as the decimal number 32.
Converting from decimal to octal or hexadecimal
It turns out that when you wish to convert from decimal to octal or
hexadecimal, there is a very easy formula that you can use. I'll give you the
one for octal, and let you puzzle out the hexadecimal version (which may come
quite naturally to some of you).
To convert from octal to hexadecimal, all you need to do is group the binary
digits into pairs of three and convert each one into the corresponding octal
number. For instance, given the binary number 010011110, you would group 011
and 110 together. 010 is 2, 011 is 3 and 110 is 6. So the octal number is
0236.
So why exactly does this work? Well, let's take a look at what 011110 looks like:
0 * 2^{8}
1 * 2^{7}
0 * 2^{6}
0 * 2^{5}
+ 1 * 2^{4}
+ 1 * 2^{3}
+ 1 * 2^{2}
+ 1 * 2^{1}
+ 0 * 2^{0}
That's actually the same as
0 * 2^{2} * 2^{6}
+ 1 * 2^{1} * 2^{6}
+ 0 * 2^{0} * 2^{6}
+ 0 * 2^{2} * 2^{3}
+ 1 * 2^{1} * 2^{3}
+ 1 * 2^{0} * 2^{3}
+ 1 * 2^{2} * 2^{0}
+ 1 * 2^{1} * 2^{0}
+ 0 * 2^{0} * 2^{0}
Whoa! First, notice that the far right column is actually turning into powers
of 8! 2^{3} is 8, and 2^{6} is 64! So this means for each
group of three digits, we have the base increasing by a factor of 8.
Moreover, look at the right hand column. It can sum up to at most 7 (since
2^{0} + 2^{1} + 2^{2} = 1 + 2 + 4 and the binary digit
just decides whether each power of two is included into the sum or not).
That's exactly the same as having eight digits, 0 through 7, and once we sum
them all together, we multiply the sum by a power of eight. That's just the same as making each group of three binary digits an octal digit!
Knowing this, can you come up with the way to do the same thing for hexadecimal numbers?


