ME Labs, Inc.
  Developer Resources:

Programming Clues
    Sample Programs
Compiler Manual
    PICBASIC™ Compiler
    Serin2/Serout2 Modes
    ASCII Character Set
    Number Conversion
    Floating Point
    PBP Debug Monitor
    Articles and Tutorials

Hardware Clues
    Parts / Vendor List
    PICPROTO™ Boards
    LAB-X1 Docs
    LAB-X2 Docs
    LAB-X20 Docs
    LAB-X3 Docs
    LAB-X4 Docs
    LAB-XUSB Docs
    LAB-XT Docs

Hexadecimal Number System

A big problem with the binary system is verbosity. To represent the value 202 requires eight binary digits.

The decimal version requires only three decimal digits and, thus, represents numbers much more compactly than does the binary numbering system. This fact was not lost on the engineers who designed binary computer systems.

When dealing with large values, binary numbers quickly become too unwieldy. The hexadecimal (base 16) numbering system solves these problems. Hexadecimal numbers offer the two features:

  • hex numbers are very compact
  • it is easy to convert from hex to binary and binary to hex.

The Hexadecimal system is based on the binary system using a Nibble or 4-bit boundary. In Assembly Language programming, most assemblers require the first digit of a hexadecimal number to be 0, and place an "h" at the end of the number to denote the number base.  In PICBASIC, we simply put a "$" at the left end of the number.

The Hexadecimal Number System:

  • uses base 16
  • includes only the digits 0 through 9 and the letters A, B, C, D, E, and F

In the Hexadecimal number system, the hex values greater than 9 carry the following decimal value:

Binary Decimal Hex
%0000 0 $0
%0001 1 $1
%0010 2 $2
%0011 3 $3
%0100 4 $4
%0101 5 $5
%0110 6 $6
%0111 7 $7
%1000 8 $8
%1001 9 $9
%1010 10 $A
%1011 11 $B
%1100 12 $C
%1101 13 $D
%1110 14 $E
%1111 15 $F

This table provides all the information you'll ever need to convert from one number base into any other number base for the decimal values from 0 to 16.

To convert a hexadecimal number into a binary number, simply break the binary number into 4-bit groups beginning with the LSB and substitute the corresponding four bits in binary for each hexadecimal digit in the number.

For example, to convert $ABCD into a binary value, simply convert each hexadecimal digit according to the table above. The binary equivalent is:

$ABCD = 1010 1011 1100 1101

To convert a binary number into hexadecimal format is almost as easy. The first step is to pad the binary number with leading zeros to make sure that the the binary number contains multiples of four bits. For example, given the binary number 1011001010, the first step would be to add two bits in the MSB position so that it contains 12 bits. The revised binary value is 001011001010.

The next step is to separate the binary value into groups of four bits, e.g., 0010 1100 1010. Finally, look up these binary values in the table above and substitute the appropriate hexadecimal digits, e.g., %0010=$2, %1100=$C, %1010=$A.  %001011001010=$2CA.

The weighted values for each position is as follows:

163 162 161 160
4096 256 16 1

Binary to Hex Conversion

It is easy to convert from an integer binary number to hex. This is accomplished by:

  1. Break the binary number into 4-bit sections from the LSB to the MSB.
  2. Convert the 4-bit binary number to its Hex equivalent.

For example, the binary value 1010111110110010 will be written:

1010 1111 1011 0010
A F B 2

Hex to Binary Conversion

It is also easy to convert from an integer hex number to binary. This is accomplished by:

  1. Convert the Hex number to its 4-bit binary equivalent.
  2. Combine the 4-bit sections by removing the spaces.

For example, the hex value $AFB2 will be written:

A F B 2
1010 1111 1011 0010

This yields the binary number 1010111110110010.

Hex to Decimal Conversion

To convert from Hex to Decimal, multiply the value in each position by its hex weight and add each value. Using the value from the previous example, $AFB2, we would expect to obtain the decimal value 44978.

(A*163) + (F*162) + ( B*161) + (2*160) =

(10*4096) + (15*256) + (11*16) + (2*1) =

40960 + 3840 + 176 + 2 = 44978

Decimal to Hex Conversion

To convert decimal to hex is slightly more difficult. The typical method to convert from decimal to hex is repeated division by 16. While we may also use repeated subtraction by the weighted position value, it is more difficult for large decimal numbers.

Repeated Division By 16

For this method, divide the decimal number by 16, and write the remainder on the side as the least significant digit. This process is continued by dividing the quotient by 16 and writing the remainder until the quotient is 0. When performing the division, the remainders which will represent the hex equivalent of the decimal number are written beginning at the least significant digit (right) and each new digit is written to the next more significant digit (the left) of the previous digit. Consider the number 44978.

Division Quotient Remainder Hex Number
44978 / 16 2811 2 2
2811 / 16 175 11 B2
175 / 16 10 15 FB2
10 / 16 0 10 AFB2

As you can see, we are back with the original number. That is what we should expect.