进制之间的转换

  • 进制相关

  • 其他进制 ==> 十进制


    二进制、八进制和十六进制向十进制转换都非常容易,就是“按权相加”;
    例如:将八进制数字 423.5176 转换成十进制
    在这里插入图片描述
//其他进制转换为十进制
//m:进制;ch:m进制的整数部分字符串,ch_f:m进制的小数部分字符串
double otherToTen(char *ch,char *ch_f,int m){
    int a = strlen(ch);
    int b = strlen(ch_f);
    int i=0;
    int j=-1;
    double val=0;
    while (a--){
        val += (ch[a]-48)* pow(m,i++);
    }
    i=0;
    while (i<b){
        val += (ch_f[i]-48)* pow(m,j--);
        i++;
    }

    return val;
}

int main() {
    char ch[100];
    int m;
    while (scanf("%s%d",&ch,&m)!=EOF){
        char *ch_f;
        int i=0;
        while (ch[i++]!='.');//按'.'分割字符串
        ch[i-1] ='\0';
        ch_f = &ch[i];
        double val = otherToTen(ch,ch_f,m);
        printf("%.11lf",val);
    }
    return 0;
}
  • 十进制 ==> 其他进制

/**
 * 整数部分
 * 思路:除 m 取余,逆序排列
 * 正整数(整数部分)=> 其他进制数
 * n:输入的正整数;m:输入要转换为m进制
 */
void tenToOther(char *ch,int n,int m){
    int count=0;
    while (n){
        ch[count++] = n%m+48;
        n /= m;
    }
    int i=0,j=count-1;
    while (i<j){
        char c = ch[i];
        ch[i] = ch[j];
        ch[j] = c;
        i++;
        j--;
    }
}
/**
 * 小数部分
 * 思路:乘 N 取整,顺序排列
 * 正整数(小数部分)=> 其他进制数
 * n:输入的正整数;m:输入要转换为m进制
 */
void tenToOther_f(char *ch,double n,int m){
    int count=0;
    while (n){
        int x = (int)(n*m);
        ch[count++] = x + 48;
        n = n*m-x;
    }
}

//整合整数和小数部分
int main() {
    double n;
    int m;
    while (scanf("%lf%d",&n,&m)!=EOF){
        char ch[100]={0};
        char ch_f[100]={0};
        int x = (int)n;
        double y = n-x;
        tenToOther(ch,x,m);
        tenToOther_f(ch_f,y,m);
        printf("%s.%s",ch,ch_f);
    }
    return 0;
}
  • 二进制和八进制、十六进制的转换

  1. 二进制整数转换为八进制整数时,每三位二进制数字转换为一位八进制数字;八进制整数转换为二进制整数时,思路是相反的,每一位八进制数字转换为三位二进制数字
  2. 二进制整数转换为十六进制整数时,每四位二进制数字转换为一位十六进制数字;十六进制整数转换为二进制整数时,思路是相反的,每一位十六进制数字转换为四位二进制数字

  • 字节相关

    1个元器件称为1比特(Bit)或1位,8个元器件称为1字节(Byte)
    1Byte = 8 Bit
    一个字节最多可表示最大值为2^8 - 1

  • 为什么int类型的最大值是2^31-1 ?

  •   int类型是8个字节,32位,最大值用二进制表示就是, 0111...(总共31个1)
      为什么第一位是0? 二进制里,最高位(第一位)表示符号
      0表示正,1表示负
    

  • ASCII 编码


    ASCII 是“American Standard Code for Information Interchange”的缩写,翻译过来是“美国信息交换标准代码”。

标准 ASCII 编码共收录了 128 个字符。

字符十进制值
‘A~Z’65~90
‘a~z’97~122
‘0~9’48~57
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值