# Conversion to any base, with a fixed number of digits

0 Tallied Votes 201 Views

Here's a function that manually converts an integer to any base between 2 and 36, the parameter list is:

``````void toBase(
int value,		// Integer value to convert
char *target,	// Pointer to a large enough buffer
int base,		// Base (from 2 to 36)
int fixedDigitCount	// The minimum number of digits it must contain
);``````

This gives me the following output:

Binary with no fixed number of digits (1 to 15):
1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111

Binary with 4 fixed digits (1 to 15):
0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111

Octal with no fixed number of digits (1 to 15):
1 2 3 4 5 6 7 10 11 12 13 14 15 16 17

Octal with 3 fixed digits (1 to 15):
001 002 003 004 005 006 007 010 011 012 013 014 015 016 017

Decimal with no fixed number of digits (1 to 15):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Decimal with 4 fixed digits (1 to 15):
0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 0012 0013 0014 0015

Hex with no fixed number of digits (1 to 15):
1 2 3 4 5 6 7 8 9 A B C D E F

Hex with 2 fixed digits (1 to 15):
01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

``````#include <iostream>
#include <iomanip>
using namespace std;

const char *valLookup = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
void toBase(int value, char *target, int base, int fixedDigitCount = 0) {
int digitCount = 1;
int temp = value;
bool _signed = value < 0;

// Find digit count
while ( temp /= base )
digitCount++;

// Compare with fixeed number of digits, use highest
int i = max( fixedDigitCount, digitCount ) + _signed;

if ( _signed )
target[0] = '-';

// Convert
for (int off; i - _signed; i--) {
off = (value % base);
value /= base;
target[i-1] = valLookup[off < 0 ? -off : off];
}

target[ max(fixedDigitCount, digitCount) + _signed ] = 0;
}

int main() {
char buffer[32];

cout << "Binary with no fixed number of digits (1 to 15):\n";
for (int i = 1; i <= 15; ++i) {
toBase( i, buffer, 2 );
cout << buffer << ' ';
}

cout << "\n\nBinary with 4 fixed digits (1 to 15):\n";
for (int i = 1; i <= 15; ++i) {
toBase( i, buffer, 2, 4 );
cout << buffer << ' ';
}

cout << "\n\n\nOctal with no fixed number of digits (1 to 15):\n";
for (int i = 1; i <= 15; ++i) {
toBase( i, buffer, 8 );
cout << buffer << ' ';
}

cout << "\n\nOctal with 3 fixed digits (1 to 15):\n";
for (int i = 1; i <= 15; ++i) {
toBase( i, buffer, 8, 3 );
cout << buffer << ' ';
}

cout << "\n\n\nDecimal with no fixed number of digits (1 to 15):\n";
for (int i = 1; i <= 15; ++i) {
toBase( i, buffer, 10 );
cout << buffer << ' ';
}

cout << "\n\nDecimal with 4 fixed digits (1 to 15):\n";
for (int i = 1; i <= 15; ++i) {
toBase( i, buffer, 10, 4 );
cout << buffer << ' ';
}

cout << "\n\n\nHex with no fixed number of digits (1 to 15):\n";
for (int i = 1; i <= 15; ++i) {
toBase( i, buffer, 16 );
cout << buffer << ' ';
}

cout << "\n\nHex with 2 fixed digits (1 to 15):\n";
for (int i = 1; i <= 15; ++i) {
toBase( i, buffer, 16, 2 );
cout << buffer << ' ';
}

cin.ignore();
}``````
twomers 408

Looks good.
Have you considered negative bases, for fullness?

William Hemsworth 1,339

I had never even heard of a negative base until you said that, I looked it up and it seems interesting. But, this function already uses a sign to represent negative numbers, maybe I could make a different one to handle negative bases.

Thanks for the feedback :)

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.