1.进制转换
1.十进制转其他进制
1.整数转换(短除法)
- 以十进制数520为例,分别转换为二进制、八进制、十六进制,转换过程如下:
- 短除法:转进制除以几,余数倒过来为结果
2.小数转换
- 例如:转换为2进制:用2乘以小数部分,每次都将结果整数取出,然后用剩余小数部分继续乘以2,直到小数部分为零,或者达到要求的精度为止
2.其他进制转十进制:位权相加
位权相加:
- 首先,需要对其他进制进行编号,个位为0,整数部分从右往左依次为0 1 2 3 4…,小数部分从左往右依次为 -1 -2 -3 -4…
- 然后,把每一位的数通过这个公式计算:数值*基数(该数是几进制)编号,然后把结果相加,即得到转换结果
1.二进制10 0000 1000 转十进制
98 7654 3210 编号
10 0000 1000 B
1*2^9+1*2^3=520D(结果)
2.八进制1010转十进制
3210 编号
1010 O
1*8^3+1*8^1=520D(结果)
3.十六进制208转十进制
210 编号
208 H
2*16^2+8*16^0=520H(结果)
4.二进制转十进制带小数
543210 -1 -2 -3 编号
100001. 1 0 1 B
1*2^5+1*2^0+1*2^-1+1*2^-3=33.625
八进制、十六进制与二进制相互转换(拆位与合位)
-
八进制与二进制:一个八进制数可以拆分为3个二进制数,3个二进制数可以合成一个八进制数
//二进制转八进制 001 000 001 000 B 1 0 1 0 O //八进制转二进制 1 3 1 4 5 2 0 O 001 011 001 100 101 010 000 B
-
十六进制与二进制:一个十六进制数可以拆分为4个二进制数,4个二进制数可以合成一个十六进制数
//二进制转十六进制 0010 0000 1000 B 2 0 8 H //十六进制转二进制 1 3 1 4 5 2 0 H 0001 0011 0001 0100 0101 0010 0000 B
为什么可以这样拆位与合位
- 三位二进制数表示的范围是0-8 ——> 23 对于八进制来说刚刚好
- 四位二进制数表示的范围是0-16 —–> 24 对于16进制来说刚刚好
2.进制转换练习
1.1-1.二进制转十进制
从键盘输入二进制串(可以带小数,也可以不带小数),编写程序将其转换成二进制并输出。
样例输入:100001.101
样例输出:33.625
#include<stdio.h>
#include<string.h>
#include<math.h>
void transition2_10(char str[], int point, int len);
int main()
{
char str[100] = { 0 };
gets_s(str, 100);
int point = 0, len = strlen(str);
for ( int i = 0; i < len; i++)
{
if(str[i]=='.')
{
point = i;
break;
}
point = i+1; //point指向整数的后一位
}
transition2_10(str, point, len);
return 0;
}
void transition2_10(char str[], int point, int len)
{
long left_Sum = 0;
double right_Sum = 0;
int right = 0, left = -1;
for (int i = point; i > 0; i--) //整数部分的和
{
left_Sum += (str[i - 1] - '0') * pow(2, right); //-'0'把字符转换为整数
right++;
}
for (int j = point+1 ; j < len; j++) //小数部分的和
{
right_Sum += (str[j] - '0') * pow(2, left);
left--;
}
printf("%f", right_Sum + left_Sum);
}
2.1-2.十进制整数转二进制
样例输入:267
样例输出:100001011
提示:可用下列方法实现
(1)用逻辑与运算、逻辑左移判断某一位是否为1(不能使用数组、字符串函数)
(2)用数组实现
(3)用字符串函数实现
#include <stdio.h>
#define _Max 32
int main()
{
int m = 0, n = 0;
int sum[_Max] = { 0 };
scanf("%d", &m);
while ( m )
{
sum[n++] = m % 2;
m /= 2;
}
for (int i = n-1; i >= 0 ; i--)
{
printf("%d", sum[i]);
}
return 0;
}
3.1-3.十进制小数转二进制
样例输入:0.71875
样例输出:0.10111
说明:小数点后不超过10位
#include<stdio.h>
int main()
{
double n;
scanf("%lf", &n);
printf("0.");
while ( n > 0 )
{
n *= 2;
if (n >= 1)
{
printf("1");
n -= 1;
}
else
{
printf("0");
}
}
return 0;
}
4.1-4.带小数的十进制转二进制
(2017蓝桥杯湖北师范大学校内选拔赛试题)
样例输入:327.671875
样例输出:10100 0111.101011
说明:小数点后不超过10位
#include<stdio.h>
#define _Max 32
void transition10_2(double k);
int main()
{
double m;
scanf("%lf", &m);
transition10_2(m);
return 0;
}
void transition10_2(double k)
{
double n;
int x = 0, a[_Max] = { 0 }, i = 0;
x = (int)k; //整数部分
n = k - x; //小数部分
while (x)
{
a[i++] = x % 2;
x /= 2;
}
for (int j = i - 1; j >= 0; j--)
{
printf("%d", a[j]);
}
if (n > 0)
{
printf(".");
}
while (n > 0)
{
n *= 2;
if (n >= 1)
{
printf("1");
n -= 1;
}
else
{
printf("0");
}
}
}
5.1-5.十六进制转二进制
样例输入:16AC9
样例输出:1 0110 1010 1100 1001
#include <stdio.h>
#include <string.h>
#define N 100
int main()
{
int i = 0;
char ch, a[N] = { 0 };
while ((ch = getchar()) != '\n')
{
switch ( ch )
{
case '0':strcat(a, "0000"); break;
case '1':strcat(a, "0001"); break;
case '2':strcat(a, "0010"); break;
case '3':strcat(a, "0011"); break;
case '4':strcat(a, "0100"); break;
case '5':strcat(a, "0101"); break;
case '6':strcat(a, "0110"); break;
case '7':strcat(a, "0111"); break;
case '8':strcat(a, "1000"); break;
case '9':strcat(a, "1001"); break;
case 'A':strcat(a, "1010"); break;
case 'B':strcat(a, "1011"); break;
case 'C':strcat(a, "1100"); break;
case 'D':strcat(a, "1101"); break;
case 'E':strcat(a, "1110"); break;
case 'F':strcat(a, "1111"); break;
}
}
while (a[(i++)] == '0');
puts(a + i - 1);
return 0;
}