一般在程序中我们定义的都是十进制的数,但有时为了取一个比较大的数,会选择用十六进制表示。有时也会用到八进制的数。
1,进制的简称
二进制:b (binary);
八进制: oct (octal);
十进制:dec(decimal);
十六进制:hex(hexadecimal);
2,C/C++规定,八进制的数必须以“0”开头,十六进制的数必须以“0x”开头。
比如在定义十六进制时,int a = 0x3a;表示十进制的58。并不区分大小写,int 0x3A;也是正确的。
3,进制的输入输出(C++)
在输入或者输出的前面加上进制的简称:
cin>>oct>>i; //输入为八进制数。
cin>>hex>>j;//输入为十六进制数。
cin>>dec>>k;//输入为十进制数。
cout<<oct<<i;//输出为八进制数。
cout<<hex<<j;//输出为十六进制数。
cout<<dec<<k;//输出为十进制数。
然而C/C++中并没有二进制的表示,通常需要我们自己进行转换。
有了这些表示和输入输出,可以方便的进行进制的转换。
4,进制的输入输出(C)
printf是格式化输出函数,它可以直接打印十进制,八进制,十六进制,输出控制符分别为%d, %o, %x, 但是它不存在二进制,如果输出二进制,可以手写,但是也可以调用stdlib.h里面的itoa函数,他不是标准库里面的函数,但是大多数编译器里面都有这个函数,所以就介绍一下
itoa函数的原型为char* itoa(int value, char * string, int radix); int value 被转换的整数,char *string 转换后储存的字符数组int radix 转换进制数,如2,8,10,16 进制等,
下面是测试程序:
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 int main()
5 {
6
7 int a = 12;
8 printf("八进制 --> %o\n", a);
9 printf("十六进制 --> %X\n", a);
10 printf("十进制 --> %d\n", a);
11 char s[10];
12 itoa(a, s, 2);
13 printf("二进制 --> %s\n", s);
14 itoa(a, s, 3);
15 printf("三进制 --> %s\n", s);
16 return 0;
17 }
总结:
进制转换无非两种情况,其他情况用十进制作为中转。
1.x进制转10进制
2.10进制转x,进制
对于1,使用下面的代码
LL to_decimal(char N[], int radix, LL num) {
int len = strlen(N);
LL ans = 0;
/*LL mul = 1;
for (int i = len - 1; i >= 0; i--) {
ans += Map[N[i]] * mul;
mul *= radix;
}*/
for (int i = 0; i < len; i++) {
ans = ans * radix + Map[N[i]];
if (ans < 0 || ans > num) return -1;
}
return ans;
}
对于2,使用“除基取余法”;或使用itoa函数,若直接显示可以用%o之类进行格式控制。
while(i)
{
a[j]=i%2;
i/=2;
j++;
}