The base 2 number system, called binary is based on powers of 2 and contains only two digits, 0 and 1.
Counting in BinaryWith only two numerals, 1 (one) and 0 (zero), counting in binary is pretty simple. Just keep in mind the following:
10 +1 -- 11To calculate the next number:
Add the first (rightmost) digits to get 10. | Write the low digit below the line and carry the 1 just as you would when adding decimal numbers. | Next add the high digit of 11 to the 1 you carried ... | ... to get 10, and write the 10 below the line just as you would when adding decimal numbers. |
We we would count in binary as follows:
bin-dec | bin-dec | bin-dec | bin-dec |
0 - 0 | 1000 - 8 | 10000 - 16 | 11000 - 24 |
1 - 1 | 1001 - 9 | 10001 - 17 | 11001 - 25 |
10 - 2 | 1010 - 10 | 10010 - 18 | 11010 - 26 |
11 - 3 | 1011 - 11 | 10011 - 19 | 11011 - 27 |
100 - 4 | 1100 - 12 | 10100 - 20 | 11100 - 28 |
101 - 5 | 1101 - 13 | 10101 - 21 | 11101 - 29 |
110 - 6 | 1110 - 14 | 10110 - 22 | 11110 - 30 |
111 - 7 | 1111 - 15 | 10111 - 23 | 11111 - 31 |
Binary Digit Positions and Values
In base 2, each digit occupies a position worth two times the position to its right, instead of ten times as in base 10, eight times as in octal, or 16 as in hex. So if 1101001 is a binary number, it can be read as:
1101001 = 1000000 (bin) = | 1 * 26 = | 1 * 64 (decimal) = | 64 (decimal) |
+ 100000 (bin) = | 1 * 25 = | 1 * 32 (decimal) = | 32 (decimal) |
+ 00000 (bin) = | 0 * 24 = | 0 * 16 (decimal) = | 0 (decimal) |
+ 1000 (bin) = | 1 * 23 = | 1 * 8 (decimal) = | 8 (decimal) |
+ 000 (bin) = | 0 * 22 = | 0 * 4 (decimal) = | 0 (decimal) |
+ 00 (bin) = | 0 * 21 = | 0 * 2 (decimal) = | 0 (decimal) |
+ 1 (bin) = | 1 * 20 = | 1 * 1 (decimal) = | 1 (decimal) |
TOTAL = 105 (decimal) |
We total the decimal values of each binary digit to get the decimal equivalent. So 1101001 (binary) is 105 (decimal).
Converting Decimal to Binary
We can convert a decimal to binary using the same procedure we used
to convert decimal to octal or hex. The difference this time is that
we divide by 2 each time since we are working in base 2. In the following
steps we convert 105 from decimal to binary:
Step | Divide | Equals | Remainder | Digits |
---|---|---|---|---|
(1) | 105 / 2 = | 52 | 1 | 1 |
(2) | 52 / 2 = | 26 | 0 | 01 |
(3) | 26 / 2 = | 13 | 0 | 001 |
(4) | 13 / 2 = | 6 | 1 | 1001 |
(5) | 6 / 2 = | 3 | 0 | 01001 |
(6) | 3 / 2 = | 1 | 1 | 101001 |
(7) | 1 / 2 = | 0 | 1 | 1101001 |
So 105 in decimal is written as 1101001 in binary.
Converting Between Hex, Octal and Binary
Converting between binary, octal and hex is simple. First some theory. Binary is base 2. Octal is base 8, and 8 is 23. That is, it takes exactly three binary digits to make one octal digit. If we line up the binary numbers and octal numbers, the connection is even more obvious:
bin-octal-dec | bin-octal-dec | bin-octal-dec | bin-octal-dec |
0 - 0 - 0 | 1000 - 10 - 8 | 10000 - 20 - 16 | 11000 - 30 - 24 |
1 - 1 - 1 | 1001 - 11 - 9 | 10001 - 21 - 17 | 11001 - 31 - 25 |
10 - 2 - 2 | 1010 - 12 - 10 | 10010 - 22 - 18 | 11010 - 32 - 26 |
11 - 3 - 3 | 1011 - 13 - 11 | 10011 - 23 - 19 | 11011 - 33 - 27 |
100 - 4 - 4 | 1100 - 14 - 12 | 10100 - 24 - 20 | 11100 - 34 - 28 |
101 - 5 - 5 | 1101 - 15 - 13 | 10101 - 25 - 21 | 11101 - 35 - 29 |
110 - 6 - 6 | 1110 - 16 - 14 | 10110 - 26 - 22 | 11110 - 36 - 30 |
111 - 7 - 7 | 1111 - 17 - 15 | 10111 - 27 - 23 | 11111 - 37 - 31 |
What this means is that we can convert from binary to octal simply by taking the binary digits in groups of three and converting. Consider the binary number 10110100111100101101001011. If we take the digits in groups of three from right to left and convert, we get:
10 110 100 111 100 101 101 001 011 2 6 4 7 4 5 5 1 3
That is, 10110100111100101101001011 (binary) is 264745513 (octal).
Converting from octal to binary is just as easy. Since each octal digit can be expressed in exactly three binary digits, all we have to do is convert each octal digit to three binary digits. Converting 7563021 in octal to binary goes as follows:
7 5 6 3 0 2 1 111 101 110 011 000 010 001
So 7563021 (octal) is 111101110011000010001 (binary.)
Since (almost!) all computers have a binary architecture, octal is very useful to programmers. For humans, octal is more concise, smaller, easier to work with, and less prone to errors than binary. And since it is so easy to convert between binary and octal, octal is a favored number system for programmers.
In the same way, hex is base 16 and 16 is 24. That is, it takes exactly four binary digits to make a hex digit. By taking binary digits in groups of four (right to left) we can convert binary to hex. Consider once more the binary number 10110100111100101101001011. By grouping in fours and converting, we get:
10 1101 0011 1100 1011 0100 1011 2 D 3 C B 8 B
So 10110100111100101101001011 (binary) is the same number as 2D3CB8B (hex), and the same number as 264745513 (octal).
Converting from hex to binary, simply write each hex digit as four binary digits. In this way we can convert 6F037C2:
6 F 0 3 7 C 2 0110 1111 0000 0011 0111 1100 0010
Since we can drop the leading zero, 6F037C2 (hex) is 110111100000011011111000010 (binary). Just as with octal, hex is more pleasant to work with than binary and is easy to convert.
These days, octal tends to be used by programmers who come from a mini-computer background or who work with unicode. Hex tends to be preferred by programmers with a mainframe background or who work with colors. Many programmers are at home with either.
Most of us, when we think of numbers, we do not distinguish between the number and its decimal representation. That is, the number 2701 just is "2701". Without getting too involved in mathematical metaphysics we can say that there is a number which is named by "2701" in decimal, "5171" in octal, "A79" in hex, "101001111001" in binary, and "MMDCCI" in roman numerals. The number remains the same no matter how we write it.
Computers are binary machines. The only digits they have are ones and zeros. In a computer therefore, all numbers are stored in binary. (Sort of. We will have to make adjustments in our thinking when we get to negative integers and floating point numbers. But for now, it is a useful fiction.)
Since computer numbers are binary but western humans work in decimal, most programming languages convert from binary to decimal automatically or by default when you need to print a number or convert it to a string. In Visual Basic we use CStr() to convert a number to a string, and the string will contain the decimal representation of the number. Visual Basic also has the Hex() function to convert a number to a hex string, and the Oct() function to convert a number to its octal representation. Java will convert a number to decimal automatically if you try to add a string and a number. But it also has methods toBinaryString(), toOctalString(), toHexString(), and toString() to convert. In the C programming language, an integer is converted from binary to decimal when the %d specifier is used in printf(), sprintf() or fprintf(). %o is used to convert a number to its octal representation, and %x is used to get the hex representation. C++ by default prints numbers in decimal. That is, it automatically converts from the computer's binary to decimal when you print a number. But C++ also provides the oct and hex format flags to force conversion to octal or hex instead.
Most programming languages allow programmers to write numbers in a preferred base. In C, C++ and Java we can write an octal number with a leading zero, for example as "073002". When the program is compiled, the compiler converts it to binary. A hex integer is written with a leading 0x or 0X (zero-ex) in C, C++ and Java, as in 0x7F32. In Visual Basic we write a hex number with a leading "&H;", as in &H7F32.; But as in C, C++ and Java, our hex notation is converted into binary when the program is compiled or run.
It is a common mistake among new programmers to wonder, "how does the computer know whether the number stored in my variable is decimal, binary, hex or octal?" The answer is that it always stores the numbers in binary. You have the freedom to write numbers in a convenient base and the compiler will convert to binary for you. And it is up to you, the programmer to use the language's functions to print the number out in your favored base.
Each binary digit is positioned in a column that indicates its power of 2. The column values are 1,2,4,8,16,32,64,128 or when the columns are numbered from zero, the value in each column is 2 to the power of that column number.
When calculating the decimal value add the values that have a 1 in the column and ignore the 0s. The maximum number that can be represented by 8 bits is therefore 255 as this is the result of adding together 1+2+4+8+16+32+64+128.
This is the value obtained when all the bits are 1. Notice that the first bit is on the very right hand side and it also lets you know if the number is odd or even. As an exercise create the following numbers in binary: 3, 7 64, 254
Binary numbers are added from the right to the left. Very simple rules are used : 0+0 = 0 1+0 = 1 0+1 = 1 1+1 = 0 and the 1 is carried to the next column.
When adding in any previous carry there may be 3 binary digits to add on, eg 1+1+1 = 1 and the 1 is carried again to the next column. If the carry goes beyond the maximum number of bits then an overflow has occurred and the result is no longer accurate. Try adding all the simple values given earlier.