進位制轉換之---C++/C
一,指定格式輸出
1.在C中,按指定進位制格式輸出如下,
printf("%05o\n",35); //按八進位制格式輸出,保留5位高位補零
printf("%03d\n",35); //按十進位制格式輸出,保留3位高位補零
printf("%05x\n",35); //按十六進位制格式輸出,保留5位高位補零
2.在C++中,按指定進位制格式輸出如下,
#include <bitset> #include<iostream> using namespace std; int main() { cout << "35的8進位制:" << std::oct << 35<< endl; cout << "35的10進位制" << std::dec << 35 << endl; cout << "35的16進位制:" << std::hex << 35 << endl; cout << "35的2進位制: " << bitset<8>(35) << endl; //<8>:表示保留8位輸出 return 0; }
二,C/C++各種進位制轉換庫函式
一)任意2-36進位制數轉化為10進位制數。
建議自己寫函式,程式碼如下:
int Atoi(string s,int radix) //s是給定的radix進位制字串 { int ans=0; for(int i=0;i<s.size();i++) { char t=s[i]; if(t>='0'&&t<='9') ans=ans*radix+t-'0'; else ans=ans*radix+t-'a'+10; } return ans; }
1.strtol()函式(百度百科)
函式原型:long int strtol(const char *nptr, char **endptr, int base)
base是要轉化的數的進位制,非法字元會賦值給endptr,nptr是要轉化的字元,例如:
#include<cstdio> int main() { char buffer[20]="10549stend#12"; char *stop; int ans=strtol(buffer, &stop, 8); //將八進位制數1054轉成十進位制,後面均為非法字元 printf("%d\n",ans); printf("%s\n", stop); return 0; }
輸出結果:
556
9stend#12
注意:
①如果base為0,且字串不是以0x(或者0X)開頭,則按十進位制進行轉化。
②如果base為0或者16,並且字串以0x(或者0X)開頭,那麼,x(或者X)被忽略,字串按16進位制轉化。
③如果base不等於0和16,並且字串以0x(或者0X)開頭,那麼x被視為非法字元。
④對於nptr指向的字串,其開頭和結尾處的空格被忽視,字串中間的空格被視為非法字元。
二)將10進位制數轉換為任意的n進位制數,結果為char型。
建議自己寫,程式碼如下:
string intToA(int n,int radix) //n是待轉數字,radix是指定的進位制
{
string ans="";
do{
int t=n%radix;
if(t>=0&&t<=9) ans+=t+'0';
else ans+=t-10+'a';
n/=radix;
}while(n!=0); //使用do{}while()以防止輸入為0的情況
reverse(ans.begin(),ans.end());
return ans;
}
1.itoa()函式(可以將一個10進位制數轉換為任意的2-36進位制字串)
函式原型:char*itoa(int value,char*string,int radix);
例如:itoa(num, str, 2); num是一個int型的,是要轉化的10進位制數,str是轉化結果,後面的值為目標進位制。
#include<cstdio>
#include<cstdlib>
int main()
{
int num = 10;
char str[100];
_itoa(num, str, 2); //c++中一般用_itoa,用itoa也行,
printf("%s\n", str);
return 0;
}
2.sprintf()函式(可以將一個10進位制數轉換為指定格式的n進位制字串)
函式原型:int sprintf( char *buffer, const char *format, [ argument] … );
#include<cstdio>
int main()
{
char s[100]={0};
sprintf(s, "%d", 123); //十進位制輸出產生"123"
sprintf(s, "%4d%4d", 123, 4567); //指定寬度不足的左邊補空格,產生:" 1234567"
sprintf(s, "%8o", 123); //八進位制輸出,寬度佔8個位置
sprintf(s, "%8x", 4567); //小寫16 進位制,寬度佔8 個位置,右對齊
sprintf(s, "%10.3f", 3.1415626); //產生:" 3.142"
int i = 100;
sprintf(s, "%.2f", i); //注意這是不對的
sprintf(s, "%.2f", (double)i); //要按照這種方式才行
return 0;
}
三)使用字串流stringstream(標頭檔案#include<sstream>)
1.將八,十六進位制轉十進位制。
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
int main(void)
{
string s="20";
int a;
stringstream ss;
ss<<hex<<s; //以16進位制讀入流中
ss>>a; //10進位制int型輸出
cout<<a<<endl;
return 0;
}
//輸出:32
2.將十進位制轉八,十六進位制。
#include<cstdio>
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
int main(void)
{
string s1,s2;
int a=30;
stringstream ss;
ss<<oct<<a; //10進位制轉成八進位制讀入流中,再以字串輸出
ss>>s1;
cout<<s1<<endl; //輸出:36
ss.clear(); //不清空可能會出錯。
ss<<hex<<a; //10進位制轉成十六進位制讀入流中,,再以字串輸出
ss>>s2;
cout<<s2<<endl; //輸出:1e
return 0;