Assignment Zero: Base Conversion Solution



You are to write a simple C program that will take a decimal number and a base as command line arguments and output the decimal number in that specified base. For example:

$ ./conv 13 2


$ ./conv 236709 8


$ ./conv 1352275 11


$ ./conv 38572856 64


$ ./conv 3232236286 256

$ ./conv

Usage: conv <decimal> <base>

$ ./conv 11111 65


1. Your program should be able to handle all bases from 2 to 64 and 256.

1. For bases that are powers of 2 (2, 4, 8, 16, 32, 64 and 256) you should use a **mask and shift** algorithm. See below.

1. Please name your code file `conv.c`. This will be the only file you submit to me (via the git server, we will get you connected to this on Thursday, _so come prepared_).

1. Attempt to handle errors. Another problem could be an invalid base (see example output).

1. Use a buffer of **32 characters**. This will give you 31 locations for characters and the final location should be a null.

1. Remember: you have to put the digits into the buffer _backwards_ and when the algorithm is finished, you have to _printf from the correct location in that buffer_. See the example we did in class for how to accomplish that.

### Converting Integers to Characters

Think about how to use this character array:


char *ascii = “0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/”;


You can declare this at the top of your file along with your buffer. How can you use this to accomplish a conversion to bases 11 to 64? Think about how to do this! It is just an array of characters …

### Masking & Shifting

Along with the algorithm we saw in class of modulo followed by division, you can accomplish the same result on bases that are powers of two _by masking off the number of bits you need and then shifting the bits down_. Remember how the `&` operator works? What if you are trying to convert the number 7 into base 4? How many bit patterns are there for base 4: `00`, `01`, `10` and `11` which is 0, 1, 2 and 3. Let’s see how masking works:

0111 = 7

& 0011 = 3


11 = 3

So, you’ve “masked off” the first digit by using the `&` (bitwise and) operator instead of modulo. Now you can shift those bits to the right instead of using the division operator like so:

0111 >> 2 = 01

And continue with the algorithm:

01 = 1

& 11 = 3


01 = 1

So the number 7 in base 4 is: 13!

_You must use this algorithm for the specified bases!_