C++ 数制转换

一、十进制 转换成 n 进制

      这里要求 1< n <= 9

      转换函数实现如下

 

    

[c-sharp] view plain copy print ?
  1. //将十进制 dec 转换成 n 进制,结果存在 other中,other在外部分配内存   
  2. void Decimal_to_Other(int dec, char *other, int n)  
  3. {  
  4.     //1 < n <= 9   
  5.     int i=0;  
  6.     int dec_copy = dec;  
  7.     char* tmpArray = new char[64];             
  8.     while(dec_copy != 0){     
  9.         tmpArray[i] = dec_copy%n+'0';  
  10.         dec_copy /= n;  
  11.         i++;  
  12.     }                           //n进制的串的高位 保存在 tmpArray的地位,   
  13.                                     //如 6,二进制保存为tmpArray[0~2] = {0,1,1}   
  14.     int len = i;                //n进制串长   
  15.          for(i=0;i<len;i++){         //下面将tmpArray颠倒,存在other中   
  16.         other[i] = tmpArray[len-i-1];  
  17.     }                           //other[0~2]= {1,1,0} 这就是结果   
  18.     other[len] = '/0';  
  19.     delete[] tmpArray;  
  20. }  
//将十进制 dec 转换成 n 进制,结果存在 other中,other在外部分配内存 void Decimal_to_Other(int dec, char *other, int n) { //1 < n <= 9 int i=0; int dec_copy = dec; char* tmpArray = new char[64]; while(dec_copy != 0){ tmpArray[i] = dec_copy%n+'0'; dec_copy /= n; i++; } //n进制的串的高位 保存在 tmpArray的地位, //如 6,二进制保存为tmpArray[0~2] = {0,1,1} int len = i; //n进制串长 for(i=0;i<len;i++){ //下面将tmpArray颠倒,存在other中 other[i] = tmpArray[len-i-1]; } //other[0~2]= {1,1,0} 这就是结果 other[len] = '/0'; delete[] tmpArray; }

 

调用如下:

[c-sharp] view plain copy print ?
  1. CString szNumber;  
  2.        char* bin = new char[64];          //转化成二进制   
  3. Decimal_to_Other(m_Decimal,bin,2);  
  4. szNumber.Format("%s",bin);  
  5.        AfxMessageBox(szNumber);  
  6.   
  7. char* octal = new char[64];          //转化成八进制   
  8. Decimal_to_Other(m_Decimal,octal,8);  
  9. szNumber.Format("%s",octal);  
  10.        AfxMessageBox(szNumber);  
CString szNumber; char* bin = new char[64]; //转化成二进制 Decimal_to_Other(m_Decimal,bin,2); szNumber.Format("%s",bin); AfxMessageBox(szNumber); char* octal = new char[64]; //转化成八进制 Decimal_to_Other(m_Decimal,octal,8); szNumber.Format("%s",octal); AfxMessageBox(szNumber);

 

二、十进制 转换成 十六进制

        转换函数如下

[cpp] view plain copy print ?
  1. //hex 在外部分配空间   
  2. void Decimal_to_Hex(int dec, char *hex)  
  3. {  
  4.     int i=0,flag;  
  5.     int dec_copy = dec;  
  6.     char* tmpArray = new char[64];             
  7.     while(dec_copy != 0){  
  8.         flag =  dec_copy%16;  
  9.         switch(flag){  
  10.         case 10:  
  11.             tmpArray[i] = 'A';  
  12.             break;  
  13.         case 11:  
  14.             tmpArray[i] = 'B';  
  15.             break;  
  16.         case 12:  
  17.             tmpArray[i] = 'C';  
  18.             break;  
  19.         case 13:  
  20.             tmpArray[i] = 'D';  
  21.             break;  
  22.         case 14:  
  23.             tmpArray[i] = 'E';  
  24.             break;  
  25.         case 15:  
  26.             tmpArray[i] = 'F';  
  27.             break;  
  28.         default:  
  29.             tmpArray[i] = flag+'0';  
  30.             break;  
  31.         }  
  32.         dec_copy /= 16;  
  33.         i++;  
  34.     }  
  35.     int len = i;                //n进制串长   
  36.     for(i=0;i<len;i++){  
  37.         hex[i] = tmpArray[len-i-1];  
  38.     }  
  39.     hex[len] = '/0';  
  40.     delete[] tmpArray;  
  41. }  
//hex 在外部分配空间 void Decimal_to_Hex(int dec, char *hex) { int i=0,flag; int dec_copy = dec; char* tmpArray = new char[64]; while(dec_copy != 0){ flag = dec_copy%16; switch(flag){ case 10: tmpArray[i] = 'A'; break; case 11: tmpArray[i] = 'B'; break; case 12: tmpArray[i] = 'C'; break; case 13: tmpArray[i] = 'D'; break; case 14: tmpArray[i] = 'E'; break; case 15: tmpArray[i] = 'F'; break; default: tmpArray[i] = flag+'0'; break; } dec_copy /= 16; i++; } int len = i; //n进制串长 for(i=0;i<len;i++){ hex[i] = tmpArray[len-i-1]; } hex[len] = '/0'; delete[] tmpArray; }

 

调用如下:

[cpp] view plain copy print ?
  1. CString szNumber;  
  2. char* hex = new char[64];          //转化成十六进制   
  3. Decimal_to_Hex(m_Decimal,hex);  
  4. szNumber.Format("%s",hex);  
  5. AfxMessageBox(szNumber);  
CString szNumber; char* hex = new char[64]; //转化成十六进制 Decimal_to_Hex(m_Decimal,hex); szNumber.Format("%s",hex); AfxMessageBox(szNumber);

 

 

三、二进制 转换成 十进制

 

[c-sharp] view plain copy print ?
  1. int Binary_to_Decimal(CString szBin){  
  2.     int len = szBin.GetLength();             //二进制串长   
  3.     char* str = new char[len];               //存放串   
  4.     double result = 0.0;                     //结果   
  5.   
  6.     strcpy(str,szBin.GetBuffer(0));  
  7.   
  8.         for(int i=0;i<len;i++){                     
  9.         if(str[i] == '1'){    
  10.                 result += pow(2,len-i-1);  //计算 2 的 len-i 次方,并加入到最终结果中   
  11.             continue;  
  12.         }  
  13.         else if(str[i] == '0'){  
  14.   
  15.         }  
  16.         else{  
  17.             AfxMessageBox("输入二进制串有误!");  
  18.             return 0;  
  19.         }  
  20.     }  
  21.     return (int)result;  
  22. }  
int Binary_to_Decimal(CString szBin){ int len = szBin.GetLength(); //二进制串长 char* str = new char[len]; //存放串 double result = 0.0; //结果 strcpy(str,szBin.GetBuffer(0)); for(int i=0;i<len;i++){ if(str[i] == '1'){ result += pow(2,len-i-1); //计算 2 的 len-i 次方,并加入到最终结果中 continue; } else if(str[i] == '0'){ } else{ AfxMessageBox("输入二进制串有误!"); return 0; } } return (int)result; }

 

调用如下:

[cpp] view plain copy print ?
  1. CString szBinary = "101101101";  
  2. int decimal;  
  3. CString szDecimal;  
  4. decimal = Binary_to_Decimal(szBinary);  
  5. szDecimal.Format("十进制 结果为 %d",decimal);  
  6. AfxMessageBox(szDecimal);  
CString szBinary = "101101101"; int decimal; CString szDecimal; decimal = Binary_to_Decimal(szBinary); szDecimal.Format("十进制 结果为 %d",decimal); AfxMessageBox(szDecimal);

 

四、八进制 转换成 十进制

[c-sharp] view plain copy print ?
  1. int Octal_to_Decimal(CString szOct){  
  2.     int len = szOct.GetLength();                //串长       
  3.     char* str = new char[len];               //存放串   
  4.     double result = 0.0;                     //结果   
  5.       
  6.     int nOct;  
  7.     strcpy(str,szOct.GetBuffer(0));  
  8.       
  9.         for(int i=0;i<len;i++){    
  10.   
  11.         if(str[i] == '0'){    
  12.                         nOct = 0;  
  13.         }  
  14.         else if(str[i] == '1'){   
  15.                 nOct = 1;  
  16.         }  
  17.         else if(str[i] == '2'){   
  18.             nOct = 2;  
  19.         }  
  20.         else if(str[i] == '3'){   
  21.             nOct = 3;  
  22.         }  
  23.         else if(str[i] == '4'){   
  24.             nOct = 4;  
  25.         }  
  26.         else if(str[i] == '5'){   
  27.             nOct = 5;  
  28.         }  
  29.         else if(str[i] == '6'){   
  30.             nOct = 6;  
  31.         }  
  32.         else if(str[i] == '7'){   
  33.             nOct = 7;  
  34.         }  
  35.         else{  
  36.             AfxMessageBox("输入八进制串有误!");  
  37.             return 0;  
  38.         }  
  39.           
  40.         result += (nOct*pow(8,len-i-1));  
  41. //      CString  msg;msg.Format("nOct = %d pow = %f result = %f",nOct,pow(8,len-i-1),result);   
  42. //      AfxMessageBox(msg);   
  43.     }  
  44. //  delete[] str;   
  45.     return (int)result;  
  46. }  
int Octal_to_Decimal(CString szOct){ int len = szOct.GetLength(); //串长 char* str = new char[len]; //存放串 double result = 0.0; //结果 int nOct; strcpy(str,szOct.GetBuffer(0)); for(int i=0;i<len;i++){ if(str[i] == '0'){ nOct = 0; } else if(str[i] == '1'){ nOct = 1; } else if(str[i] == '2'){ nOct = 2; } else if(str[i] == '3'){ nOct = 3; } else if(str[i] == '4'){ nOct = 4; } else if(str[i] == '5'){ nOct = 5; } else if(str[i] == '6'){ nOct = 6; } else if(str[i] == '7'){ nOct = 7; } else{ AfxMessageBox("输入八进制串有误!"); return 0; } result += (nOct*pow(8,len-i-1)); // CString msg;msg.Format("nOct = %d pow = %f result = %f",nOct,pow(8,len-i-1),result); // AfxMessageBox(msg); } // delete[] str; return (int)result; }

调用如下:

[cpp] view plain copy print ?
  1. CString szOctal = "1721";  
  2. int decimal;  
  3. CString szDecimal;  
  4. decimal = Octal_to_Decimal(szOctal);  
  5. szDecimal.Format("十进制 结果为 %d",decimal);  
  6. AfxMessageBox(szDecimal);  
CString szOctal = "1721"; int decimal; CString szDecimal; decimal = Octal_to_Decimal(szOctal); szDecimal.Format("十进制 结果为 %d",decimal); AfxMessageBox(szDecimal);

 

 

五、十六进制 转换成 十进制

[c-sharp] view plain copy print ?
  1. int Hex_to_Decimal(CString szHex){  
  2.     int len = szHex.GetLength();             //串长      
  3.     char* str = new char[len];               //存放串   
  4.     double result = 0.0;                     //结果   
  5.       
  6.     int nHex;  
  7.     strcpy(str,szHex.GetBuffer(0));  
  8.       
  9.         for(int i=0;i<len;i++){    
  10.           
  11.         if(str[i] == '0'){    
  12.                         nHex = 0;  
  13.         }  
  14.         else if(str[i] == '1'){   
  15.             nHex = 1;  
  16.         }  
  17.         else if(str[i] == '2'){   
  18.             nHex = 2;  
  19.         }  
  20.         else if(str[i] == '3'){   
  21.             nHex = 3;  
  22.         }  
  23.         else if(str[i] == '4'){   
  24.             nHex = 4;  
  25.         }  
  26.         else if(str[i] == '5'){   
  27.             nHex = 5;  
  28.         }  
  29.         else if(str[i] == '6'){   
  30.             nHex = 6;  
  31.         }  
  32.         else if(str[i] == '7'){   
  33.             nHex = 7;  
  34.         }  
  35.         else if(str[i] == '8'){   
  36.             nHex = 8;  
  37.         }  
  38.         else if(str[i] == '9'){   
  39.             nHex = 9;  
  40.         }  
  41.         else if(str[i] == 'A'){   
  42.             nHex = 10;  
  43.         }  
  44.         else if(str[i] == 'B'){   
  45.             nHex = 11;  
  46.         }  
  47.         else if(str[i] == 'C'){   
  48.             nHex = 12;  
  49.         }  
  50.         else if(str[i] == 'D'){   
  51.             nHex = 13;  
  52.         }  
  53.         else if(str[i] == 'E'){   
  54.             nHex = 14;  
  55.         }  
  56.         else if(str[i] == 'F'){   
  57.             nHex = 15;  
  58.         }  
  59.         else{  
  60.             AfxMessageBox("输入十六进制串有误!");  
  61.             return 0;  
  62.         }  
  63.           
  64.         result += (nHex*pow(16,len-i-1));  
  65.     }  
  66.     return (int)result;  
  67. }  
int Hex_to_Decimal(CString szHex){ int len = szHex.GetLength(); //串长 char* str = new char[len]; //存放串 double result = 0.0; //结果 int nHex; strcpy(str,szHex.GetBuffer(0)); for(int i=0;i<len;i++){ if(str[i] == '0'){ nHex = 0; } else if(str[i] == '1'){ nHex = 1; } else if(str[i] == '2'){ nHex = 2; } else if(str[i] == '3'){ nHex = 3; } else if(str[i] == '4'){ nHex = 4; } else if(str[i] == '5'){ nHex = 5; } else if(str[i] == '6'){ nHex = 6; } else if(str[i] == '7'){ nHex = 7; } else if(str[i] == '8'){ nHex = 8; } else if(str[i] == '9'){ nHex = 9; } else if(str[i] == 'A'){ nHex = 10; } else if(str[i] == 'B'){ nHex = 11; } else if(str[i] == 'C'){ nHex = 12; } else if(str[i] == 'D'){ nHex = 13; } else if(str[i] == 'E'){ nHex = 14; } else if(str[i] == 'F'){ nHex = 15; } else{ AfxMessageBox("输入十六进制串有误!"); return 0; } result += (nHex*pow(16,len-i-1)); } return (int)result; }

 

调用如下:

[cpp] view plain copy print ?
  1. CString szHex = "1A2B";  
  2. int decimal;  
  3. CString szDecimal;  
  4. decimal = Hex_to_Decimal(szHex);  
  5. szDecimal.Format("十进制 结果为 %d",decimal);  
  6. AfxMessageBox(szDecimal);  
CString szHex = "1A2B"; int decimal; CString szDecimal; decimal = Hex_to_Decimal(szHex); szDecimal.Format("十进制 结果为 %d",decimal); AfxMessageBox(szDecimal);

 

六、利用栈实现

[cpp] view plain copy print ?
  1. //《数据结构 c语言版》(严蔚敏) P48   
  2. void conversion(int N){  
  3.      InistStack(S);  
  4.      scanf("%d",dec);    //从屏幕读取一个十进制   
  5.       while(dec != 0){    //转换   
  6.         Push(S,dec%N);  
  7.         dec /= N;  
  8.      }  
  9.      while(!StackEmpty(S)){ //显示结果   
  10.         Pop(S,e);  
  11.         printf("%d",e);  
  12.      }  
  13. }  

PS:我实现了一个数值转化的小工具,大家可以下载使用。

  http://download.csdn.net/source/2869264

你可能感兴趣的:(C++ 数制转换)