黑马程序员--C语言基础--进制

本文介绍了进制的基本概念,包括二进制、十进制、八进制和十六进制,以及进位规则。同时,讨论了机器数、真值、原码、反码和补码等概念。文章还提供了三个代码练习,涉及将十进制数转换为二进制,计算一组数的和、平均值、最大值和最小值,以及使用商余法求解2至16之间的任意进制数。
摘要由CSDN通过智能技术生成

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

进制

简介:今天老师讲了进制的知识,我总结了下述知识点,并在最后编写了自己的练习代码巩固所学知识

一、进制的概念

      计数方式,数值的表示形式

二、常见进制

      二进制、十进制、十六进制和八进制

三、进位方法

      十进制:满十进一
      二进制:满二进一
      八进制:满八进一
      十六进制:满十六进一

四、机器数与真值

      机器数:所谓机器数,就是数据在计算机中的二进制形式。
      真值:所谓真值,是指机器数表示的实际数字。
     
      注意事项:
      1)机器数是带有符号的
      2)机器数不一定唯一表示一个真值
      3)有符号类型与无符号类型

五、原码、反码和补码

      原码、反码和补码
      数据存储在计算机中需要以一种形式进行存储,而原码、反码和补码即为数据存储细节方面的专业术语。说白了就是存储原理。
      首先数据的存储方式是:
      在计算机中,数据都是以补码的形式进行存储
      正数:反码 == 补码 == 原码
      负数:原码即为符号+二进制
      反码== 原码除符号位取反
      补码== 反码 + 1

六、位运算

      位运算符简介
      所谓的位运算,即是在数据的二进制格式下进行计算。
      C 语音的位运算符常见的有:按位与、按位或以及按位异或和安慰取反,还有左移和右移等。位运算是专门处理整数运算的。
      位运算
      按位与(&)同1为1
      按位或(|)同0则0
      按位取反(~)10互反
      按位异或(^)同0异1
      左移(<<)
      右移(>>)

代码练习内容:

一、将十进制数使用位运算的方式输出二进制数

//  Created by george on 15/4/3.
//
//输出二进制数

#include <stdio.h>

int main(int argc, const char * argv[]) {
    int num, a[32]={0};
    printf("请输入十进制数字:\n");
    scanf("%d",&num);
   //由于int类型8个字节,共32个二进制位,所以用来保存二进制数的数组和计算次数均为32次
    for(int k = 0;k < 32; k++){
         //从最高二进制位开始取,所以向右移,将最高位移到最右,与1做位与,保存在数组中
         a[k] = (num >> (32 - k - 1))&1;
    }
    
    for(int i = 0; i < 32;i++){
        printf("%d",a[i]);
           //每四位增加输出一个空格,结果更容易观察
           if( (i + 1)%4 == 0){
            printf(" ");
        }
    }
    printf("\n");
        
    return 0;
}

二、输入10个数,求出这10个数的和、平均值、最大值、最小值


//
//  Created by george on 15/4/3.
//
//输入10个数,求出这10个数的和、平均值、最大值、最小值

#include <stdio.h>

int main(int argc, const char * argv[]) {
    int sum = 0;
    //定义长度为10的数组,初始化为0
    int num[10]={0};
    //定义并初始化最小值和最大值变量
    int min = num[0],max = num[0];
    //提示输入数字
    for(int i = 0; i <10;i++){
        printf("请输入第%d个数字:\n",i+1);
        scanf("%d",&num[i]);
    }
    printf("\n");
    min = num[0];
    //进行最大值最小值的比较
    for(int i = 0;i < 10;i++){
        sum += num[i];
        if(min > num[i]){
            min = num[i];
        }
        if(max < num[i]){
            max = num[i];
        }
    }
    //打印计算结果
    printf("和为%d,平均值%lf,最大值%d,最小值%d\n",sum,(double)sum/10.0,max,min);

    printf("\n");

    return 0;
}

三、自我拓展练习:利用商余发求出正整数的n进制数(n在2和16之间)

----编程思想已写在注释中,其中用到了goto语句。int类型转换到char类型用来兼容10进制以上要输出字符的条件

//以25转换为2进制为例
//      25    25/2 == 12   25%2 == 1
//  1   12    12/2 == 6    12%2 == 0
//  0   6     6/2 ==  3    6%2 ==  0
//  0   3     3/2 ==  1    1%2 ==  1
//  1   1     1/2 ==  0    1%2 ==  1
// 25转换为2进制后为 11001
#include <stdio.h>

void transNum(int num1,int n){
    //定义一个为0的空数组存储计算得到的各位数字,
    //i和tmp是在运算前确定生成后的数位有几个
    int num[30]={0},i = 1, tmp = num1;
    //首先排除两种情况,一是输入的数字小于进制数,这样直接把数字赋值给数组等待label1处理
    if(num1 < n){
        num[0] = num1;
        goto label1;
    }
    //输入数字和进制数相等时,不需要计算,直接将1装入数组中,等待label1处理
    else if (num1 == n){
        num[0] = 1;
        goto label1;

    }
    //预计算新生成的数组有多长,利用tmp防止原数据被修改
    while(tmp /= n){
        i++;
    }

    //根据规律,利用商余法求得各位数字,并倒序存到数组中
    for (int j = i - 1; j >= 0 ; j--) {
        num[j] = num1%n;
        num1 = num1/n;
        
    }
    
label1:
    //对数组中大于10的数字进行替换,由于最高到16进制,所以只需要替换到15
    //此时数组存储的都为数字字符,即0~f的ascii
    for (int k = 0; k < i; k++) {
        switch (num[k]) {
            case 10:
                num[k] = 'a';
                break;
            case 11:
                num[k] = 'b';
                break;
            case 12:
                num[k] = 'c';
                break;
            case 13:
                num[k] = 'd';
                break;
            case 14:
                num[k] = 'e';
                break;
            case 15:
                num[k] = 'f';
                break;
            default:
                //计算字符1和数字1的ascii差值,加给原数进行转换
                num[k] = num[k] + ('1' - 1);
                break;
        }
    }
        printf("此数转换为%d进制后为:",n);
    //遍历输出,因为已经转换成字符,所以使用%c
        for (int k = 0; k < i; k++) {

        printf("%c",num[k]);
            
    }
    printf("\n");

}

int main(int argc, const char * argv[]) {
    int num1,n;
    printf("请输入一个十进制数:\n");
    scanf("%d",&num1);
    printf("转换为几进制?\n");
    scanf("%d",&n);
    
    transNum(num1,n);

    
    return 0;
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值