Converting between different bases--e.g. base 10 and base 2.
There are a number of methods that let
you convert a number in, say, base 10, to a number
in, say, base 2. We'll start with going from base 2 to base 10.
We'll just look here at 6-bit unsigned (i.e. nonnegative) binary
values. 010100 in binary
is what in base 10? It's easiest to read off from
right-to-left: we have 0x2 to the power
0 plus 0x2 to the power 1 plus 1x2 to the power 2 plus 0x2 to the power
3 plus 1x2 to the
power 4 plus 0x2 to the power 5: 0 + 0 + 4 + 0 + 16 + 0 =
20 in base 10. Why work right-
to-left rather than left-to-right? The latter method would
require that you count bits
to see that the leftmost bit is 2 to the power 5, and if you
miscounted--the answer will
be wrong. You can also write down something like:
0
1
0
1 0 0
--- --- ---
--- --- ---
32
16 8
4
2 1
and then add up the values below the lines where there's a 1 above the
line--16 + 4 = 20.
-------------------------------------------------------------------
Converting from base 10 to base 2. Let's take the decimal number
23. We can write down
--- --- --- ---
--- ---
32
16 8
4
2 1
Then we ask "Is the value greater than or equal to 32?" If
the answer was "yes" we would
write a 1 in above the 32 and subtract 32 to see what we had
left. But here 32 > 23. So we
write a 0 above the 32. "Is the value greater than or equal to
16?" The answer here is "yes"
so we write a 1 above the 16 and subtract 16 from 23 to get 7--we still
have to convert the
7 part. "Is the value (i.e. 7) greater than or equal to 8?"
No--so we write 0 above the 8.
"Is the value (7) greater than or equal to 4?" Yes--so we write a
1 above the 4 and subtract
4 from 7 to get 3. "Is the value (now 3) greater than or equal to
2?" Yes, so we write 1 in
above the 2 and subtract 2 from 3 to get 1. "Is the value (now 1)
greater than or equal to 1?"
Yes, so we write a 1 above the 1, and subtract 1 from 1 to get 0--and
we're done:
0
1 0
1 1 1
--- --- --- --- --- ---
32
16 8
4 2 1
A second approach uses remainders. We take our base 10 value (23)
and divide it by 2
(the base we are trying to convert to). The result is 11 with a
remainder of 1. Next,
we divide 11 by 2 to get 5 with a remainder of 1. We divide 5 by
1 to get 2 with a
remainder of 1. We divide 2 by 2 to get 1 with a remainder of
0. Finally, we divide 1
by 2 to get 0 with a remainder of 1. Here are the
remainders:
step remainder
---------------
1
1
2
1
3
1
4
0
5
1
so as an unsigned 5-bit number, 23 = 10111
-------------------------------------------------------------
Signed Binary
We've looked at just unsigned integers. Converting nonnegative
numbers (leftmost bit
is a 0) is just like converting unsigned binary. But suppose we
have a 6-bit signed binary
111111 -- what does this convert to? Well, here, IT DEPENDS!! It really does
depend.
Take a look at my notes on the binary representation of integers!
In sign-and-magnitude,
111111 = - 31. In 1's complement, 111111 = -0 = 0. In 2's
complement, 111111 = -1. To
see what 101101 converts to--you MUST know which representation you're
talking about.
In sign-and-magnitude, 101101 is the negative of 001101 = 13. In
1's complement, flip the
bits: 010010 = 18. In 2's complement, to get the negative
of 101101, first flip the bits:
010010 and add 1 --> 010011 = 19. Basically, what's happening
is that we have Y = -X
where Y is a negative number and X is nonnegative: e.g. Y =
101101, and we want to know
what X is. We can change the small equation Y = -X
to: -Y = -(-X), and -(-X) is the
same as X. So that's why, for example, in 1's complement, to find
out what 101101 is the
negative of, just flip the bits.
Hexadecimal (base 16) numbers.
Hexadecimal (usually spoken of as "hex") have digits 0-9, A, B, C, D,
E, and F.
(We need 16 digits here). We can remember phone numbers, Social
Security
Numbers, student ID numbers, passwords, etc, but it often becomes
difficult
to try to remember too many different numbers. Suppose we have a
32-bit
integer: (we'll group this by 8 bits): 00000101
11000101 00000100 11111001.
Try remembering those 32 bits or consider even telling someone else
what the
binary bits are:
"zero-zero-zero-zero-zero-one-zero-one...etc"--no joy here.
But it's not unusual to have to specify locations--addresses--in the
computer
and sometimes even values--such as the address of a printer port.
Addresses
are specified in hex--it's much easier than binary. Note
that 16 is 2 to the
power 4: 1 hex digit equals 4 binary bits, 2 hex digits = 1 8-bit
byte, etc.
So a 32-bit binary value such as the above can be represented as 8 hex
digits.
Conversion between hex and binary is trivially easy.
binary hex
decimal binary
hex dec
binary hex dec
binary hex dec
-------------------
-------------- -------------
-------------
0000
0
0
0100
4
4
1000
8
8
1100 C 12
0001
1
1
0101
5
5
1001
9
9
1101 D 13
0010
2
2
0110
6
6
1010 A
10
1110 E 14
0011
3
3
0111
7
7
1011 B
11
1111
F 15
So to convert from binary to hex, group the binary bits from right to
left by 4's and
just write down the hex digit below it:
00000101 11000101 00000100 11111001
0
5 C
5 0
4
F 9
And to convert from hex to binary, replace each hex digit by its
equivalent 4 binary bits.
A hex number such as B5F means that this is Bx16 to the
power 2 plus 5x16 to the power
1 plus Fx16 to the power 0, or, to put everything in decimal:
11x16x16 +
5x16 + 15x1 = 2816 + 80 + 15 = 2911
You can even convert a decimal number such as 2911 to hex by dividing
by the base
(i.e. 16) and keeping track of remainders:
2911 divided by 16 is 181 with a remainder of
15. 181 divided by 16 is 11 with a
remainder of 5, 11 divided by 16 is 0 with a remainder of 11.
Remember that 15 in
decimal is F in hex and that 11 in decimal is B in hex, so 2911 =
B5F. But doing this
for most people would be an exercise in masochism. Most of us
would simply go from
decimal to binary and then from binary to hex.
Note: if you look at some of the html source, you might see
text="000000" or
bgcolor="ffffff". In the quotes are 3 pairs of hex digits, each
pair of digits driving
one of the blue-green-red color guns (this isn't saying that the first
pair is blue, etc).
ffffff results in white, 000000 results in black, 0000ff looks bluish,
etc. 2 hex digits is
8 bits--you get a range of 256 (2 to the 8th) shades for each
"gun". There's very little
difference between 0000ff and 0000fe, but the difference is a little
greater between
0000ff and 0000ef, and greater still between 0000ff and 000088, for
example. These
pairs of hex digits tell html how you want the background color and
font.
---------------------------------------------------------------
Weird bases.
Suppose you've been smoking something you shouldn't have and
decide you want
to play with base negative 3 (i.e. -3). Valid digits are 0, 1,
and 2 (as they are for
base 3). So what is 211 in base -3? It's 2x(-3) to
the power 2 plus 1x(-3) to the
power 1 plus 1x(-3) to the power 0, or 2x9 + 1x(-3) + 1x0 =
16. If we add the digit
1 in front to ask about 1211 in base -3 this contributes 1x(-3) to the
power 3 or
1x(-27) so 1211 in base -3 would be -27 + 16 = -11, a negative
value. Weird!
This is just for curiosity, and will not be on the exams. Thank
goodness!