1.进制
为什么要使用二进制、八进制、十进制、十六进制?
-
因为现在的CPU只能识别高低电平,只能对二进制的数据进行计算
-
虽然二进制的数据可以直接被CPU识别计算,但是不方便书写和记录,把二进制的数据转换成八进制是为了方便记录到文档中
-
由于CPU的位数的发展不断增加,由早期的8位逐渐发展到现在的64位,因此8进制逐渐不能满足需求,所以发展出了十六进制
但是由于历史原因八进制还不能完全淘汰
十进制转二进制:
(还能转其他进制)求余法:用2对数据求余,然后继续对商求余,直到商为0结束,该过程中产生的余数结果就是该数据的二进制(逆序)
n%2 == 1\0
商%2 == 1\0
……
直到商为0
余数的逆序就是n的二进制
求权法:从高位到低位,数据 - 2^(n-1) 如果够减,那么第n位就是1,否则就是0,直到把数据减为0
128 64 32 16 8 4 2 1
86 72 112 176
1010110 1001000 1110000 10110000
练习1:输入一个正整数m,输入n(n>=2),显示m的n进制数,超过10的用字母表示
#include <stdio.h>
int main(int argc,const char* argv[])
{
int m = 0,n = 0,cnt = 0;
printf("请输入m n的值:");
scanf("%d%d",&m,&n);
char bits[32] = {}; // 定义一个32位的数组
while(m)
{
bits[cnt++] = m%n; //将余数存入数组
m /= n;
}
for(int i=cnt-1; i>=0; i--) // 逆向输出数组的值
{
if(bits[i] < 10)
{
printf("%hhd",bits[i]);
}
else
{
printf("%c",'A'+bits[i]-10); //如果大于等于10,则用大写字母来表示
}
}
}
二进制转十进制: (其他进制转十进制)
每位的2^(n-1) 求和
二进制转八进制:
从低位开始,每三位二进制位对应一位八进制
二进制转十六进制:
从低位开始,每四位二进制位对应一位十六进制
在C语言中,以0开头的数是八进制数,以0x开头的数是十六进制
%o 以8进制显示数据
%x 以16进制显示数据
%#o %#x 把数据对应的前缀显示出来