Reputation: 15
I have to write a program that converts unsigned hex to dec and dec to hex and signed hex to dec and dec to hex, without using the stream filters "hex" and "dec". My program works for the unsigned converting of hex to dec and dec to hex but NOT for the SIGNED hex to dec and dec to hex. Any help would be greatly appreciated. Thank You in advance!
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
void convertDecToHex(unsigned hexNumber);
int convertHexToDec(char hex[], unsigned numberSize);
signed SignedDecToHex (signed DecNumberSigned);
signed SignedHexToDec (int number);
int main (){
unsigned choice, numberSize = 0, hexNumber;
signed DecNumberSigned;
char hex[100000];
string number, HexNumberSigned;
while (1){
cout << "Enter 1 to convert from unsigned Dec to Hex:" << endl << "Enter 2 to convert from unsigned Hex to Dec:"
<< endl << "Enter 3 to convert from signed Dec to Hex:"<< endl << "Enter 4 to convert from signed Hex to Dec:" << endl ;
cin >> choice;
if (choice == 1){
cout << "Enter unsigned dec # to convert to hex: " << endl;
cin >> hexNumber;
convertDecToHex( hexNumber);
}//1
if (choice == 2){
cout << "Enter unsigned hex # to convert to dec: " << endl;
cin >> number;
numberSize = number.size();
strcpy(hex, number.c_str());
cout << convertHexToDec(hex, numberSize) << endl;
}//2
if (choice == 3){
cout << "Enter signed dec to convert to hex: " << endl;
cin >> DecNumberSigned;
convertDecToHex( SignedDecToHex(DecNumberSigned));
}//3
if (choice == 4){
cout << "Enter signed hex to convert to dec: " << endl;
cin >> HexNumberSigned;
numberSize = HexNumberSigned.size();
strcpy(hex, HexNumberSigned.c_str());
cout << SignedHexToDec(convertHexToDec( hex, numberSize)) << endl;
}//4
}//while
system ("pause");
}//main
void convertDecToHex(unsigned hexNumber){
int remainder, i=0;
unsigned m[99999], total, x;
char n [99999];
i=0;
do {
remainder = hexNumber % 16;
hexNumber /= 16;
m[i] = remainder;
i++;
}//doLooop
while (hexNumber > 0);
total = i;
for (i=0, x = total - 1; i < total; i++, x--){
if (m[i] == 1) n[x] = '1';
if (m[i] == 2) n[x] = '2';
if (m[i] == 3) n[x] = '3';
if (m[i] == 4) n[x] = '4';
if (m[i] == 5) n[x] = '5';
if (m[i] == 6) n[x] = '6';
if (m[i] == 7) n[x] = '7';
if (m[i] == 8) n[x] = '8';
if (m[i] == 9) n[x] = '9';
if (m[i] == 10) n[x] = 'A';
if (m[i] == 11) n[x] = 'B';
if (m[i] == 12) n[x] = 'C';
if (m[i] == 13) n[x] = 'D';
if (m[i] == 14) n[x] = 'E';
if (m[i] == 15) n[x] = 'F';
}
for (i=0; i < total; i++)
cout << n[i];
cout << endl;
}//DecToHex
int convertHexToDec(char hex[], unsigned numberSize){
int i, j;
int n[10000];
unsigned sum = 0;
char a,b,c,d,e,f;
for (i = 0 ; i < numberSize; i++){
if (hex[i] == '1') n[i] = 1;
if (hex[i] == '2') n[i] = 2;
if (hex[i] == '3') n[i] = 3;
if (hex[i] == '4') n[i] = 4;
if (hex[i] == '5') n[i] = 5;
if (hex[i] == '6') n[i] = 6;
if (hex[i] == '7') n[i] = 7;
if (hex[i] == '8') n[i] = 8;
if (hex[i] == '9') n[i] = 9;
if (hex[i] == 'a' || hex[i] == 'A') n[i] = 10;
if (hex[i] == 'b' || hex[i] == 'B') n[i] = 11;
if (hex[i] == 'c' || hex[i] == 'C') n[i] = 12;
if (hex[i] == 'd' || hex[i] == 'D') n[i] = 13;
if (hex[i] == 'e' || hex[i] == 'E') n[i] = 14;
if (hex[i] == 'f' || hex[i] == 'F') n[i] = 15;
}//forLoop
for (i = 0, j = numberSize - 1; i < numberSize , j >= 0 ; i++, j--)
sum += pow(16,i) * n[j];
return sum;
}//HexToDec
signed SignedDecToHex (signed DecNumberSigned){
signed convertNumber;
convertNumber = DecNumberSigned + (pow (2,16));
return convertNumber;
}// SignedDecToHex
signed SignedHexToDec (int number){
int newNumber;
newNumber = number - (pow (2,16));
return newNumber;
}//SingedHexToDec
Upvotes: 0
Views: 1111
Reputation: 92
I use some like this:
long int dec = strtol("0x0A01006F", NULL, 16); // return 167837807
printf("%d\n", dec);
long int hex = strtol("167837807", NULL, 10); // return A01006F
printf("%02X\n", hex);
Upvotes: 0
Reputation: 672
Don't use pow()
when doing integer arithmetic. pow
returns values as double
which is inexact, and may result in the value being off by one when converting it to an int
.
Theoretically doubles may be exact when working with numbers being powers of two. But that assumes that you know what you are doing, which at the moment, you don't :-)
Better use bit-shifting when possible:
pow(2,n)
--> 1 << n
How to implement pow(16, n)
using bitshifting is left as excercise for the reader.
Hint: ((i^n)^m) = i ^ (n*m)
Upvotes: 1