整型进制转换程序
1. 简述
实际上,小数也是存在进制转换的,本文主要给出整型的进制转换代码实现。函数原型如下:
char* ChangeFromDecimal(unsigned int value, int base);
// value:10进制的数值;base:转化成的进制数;返回值:转化后的进制数,最后还增加了'\0'
int ChangeToDecimal(char* value, int base);
// 工作与ChangeFromDecimal相反,将某种进制的字符串表示,转化为int数值
2. 代码实现
#include <iostream>
#include <stack>
using namespace std;
char* ChangeFromDecimal(unsigned int value, int base) {
char* result;
stack<char> result_stack;
unsigned int tmp;
#include <stack>
using namespace std;
char* ChangeFromDecimal(unsigned int value, int base) {
char* result;
stack<char> result_stack;
unsigned int tmp;
result_stack.push('\0');
while(value) {
tmp = value % base;
value = value / base;
result_stack.push(tmp < 10 ? (tmp+'0') : (tmp-10+'A'));
}
result = new char[result_stack.size()];
tmp = 0;
while(!result_stack.empty()) {
result[tmp++] = result_stack.top();
result_stack.pop();
}
return result;
}
int ChangeToDecimal(char* value, int base) {
int result = 0;
while(*value != '\0') {
result = result * base;
result += (*value)<='9'?(*value-'0'):(*value-'A'+10);
value++;
}
return result;
}
int main() {
int num = 253;
char *result;
cout << (result = ChangeFromDecimal(num, 2)) << endl;
cout << ChangeToDecimal(result, 2) << endl;
cout << "----------------------------------------" << endl;
delete []result;
cout << (result = ChangeFromDecimal(num, 8)) << endl;
cout << ChangeToDecimal(result, 8) << endl;
cout << "----------------------------------------" << endl;
delete []result;
cout << (result = ChangeFromDecimal(num, 16)) << endl;
cout << ChangeToDecimal(result, 16) << endl;
delete []result;
result = 0;
system("PAUSE");
return 0;
}
while(value) {
tmp = value % base;
value = value / base;
result_stack.push(tmp < 10 ? (tmp+'0') : (tmp-10+'A'));
}
result = new char[result_stack.size()];
tmp = 0;
while(!result_stack.empty()) {
result[tmp++] = result_stack.top();
result_stack.pop();
}
return result;
}
int ChangeToDecimal(char* value, int base) {
int result = 0;
while(*value != '\0') {
result = result * base;
result += (*value)<='9'?(*value-'0'):(*value-'A'+10);
value++;
}
return result;
}
int main() {
int num = 253;
char *result;
cout << (result = ChangeFromDecimal(num, 2)) << endl;
cout << ChangeToDecimal(result, 2) << endl;
cout << "----------------------------------------" << endl;
delete []result;
cout << (result = ChangeFromDecimal(num, 8)) << endl;
cout << ChangeToDecimal(result, 8) << endl;
cout << "----------------------------------------" << endl;
delete []result;
cout << (result = ChangeFromDecimal(num, 16)) << endl;
cout << ChangeToDecimal(result, 16) << endl;
delete []result;
result = 0;
system("PAUSE");
return 0;
}
3. 重点说明
· 对于大于等于10的数字和小于10的数字要分别处理,尤其是'0'-'9'与'A'-'Z'的ASCII码是不连续的。
· 如果使用参数代替返回值的话,对于char*,要使用char*&,对于int,要使用int*。
· 由于英文字母有限,base是有限制的,10个数字加上26个字母,最多能够表示的也就是36进制。
· 最重要的一点是第一个函数将int转化为字符串进制时,一定要将int解释为unsigned int,因为函数中用到了取余运算,如果不解释的话,对于负数,计算后显示会出错的。 而第二个函数却不需要一定返回unsigned int,返回int也可以的,因为其中,只是对数值进行乘法和加法。当然,全部使用unsigned int实际上是最保险的方式,也是最安全的。如果都用unsigned int,第一个函数传入int,就会直接被转化为unsigned int,只要对第二个函数的返回值,强制转化为int,即可得到合理的显示。