精华内容
下载资源
问答
  • C语言进制之间转换

    2021-01-15 21:24:36
    课程导言 ...本篇和同学们探讨二进制计数原理以及与十进制、十六进制转换。通过本篇的学习,你将了解到为什么计算机能够直接识别二进制语言,二进制的计数原理以及与十进制、十六进制之间的数值

    转自:https://www.cnblogs.com/burningc/p/10881484.html 原创博主BurningChen

    课程导言

    【最早的编程语言是二进制语言,也是计算机能够直接识别的唯一语言。不管用什么高级语言编写的程序最后都要转换为二进制语言,才能在计算机上执行,因此掌握二进制知识对学习编程语言是非常有帮助的。本篇和同学们探讨二进制计数原理以及与十进制、十六进制的转换。通过本篇的学习,你将了解到为什么计算机能够直接识别二进制语言,二进制的计数原理以及与十进制、十六进制之间的数值转换。】

     

    在讲述二进制之前,先做一个小游戏。伸出我们的右手,从小指开始,依次到大拇指分别代表数字1、2、4、8、16。并且每个手指分为两种状态,手指伸直为1状态,手指弯曲为0状态。然后分别做每个手指自由伸直或弯曲动作,记录其状态和每个手指的数字之和,状态顺序从大拇指开始:

    (1)动作:伸直小指、中指和大拇指,弯曲无名指和食指。

    状态:10101        

    数字之和:21

    (2)动作:伸直小指、无名指和中指,弯曲大拇指和食指。

    状态:00111        

    数字之和:7

    (3)动作:伸直全部手指。

    状态:11111        

    数字之和:31

    有同学可能会问,做这个游戏的意义在什么地方呢?这个游戏用直观化的方式演示了二进制数到十进制数的转换,五个手指的伸直和弯曲的状态组合用0和1表述出来,就是我们本课程要探讨的二进制数,游戏中记录的数字之和就是二进制数的十进制表示。

    前面的游戏可以把5个二进制数转换为十进制数,同样的道理,也可以把30以内的十进制数转换为二进制数。只需要把十进制数分解成16、8、4、2、1任意数字之和就可以,然后将对应数字的右手手指伸直,没有对应数字的右手手指弯曲,从大拇指开始记录其组合状态,该组合状态就是要转换的二进制数。

    例如:

    十进制数字:5=4+1   对应的二进制数为:00101

    十进制数字:28=16+8+4   对应的二进制数为:11100

    前面的游戏能不能实现更多二进制数的转换呢?当然可以,右手五个手指表示5个二进制数,如果再加上左手就可以表示10个二进制数了,所能表示的十进制数也更大。依次类推,多人合作可以表示更多位的二进制数和更大的十进制数。

    从前面的游戏中可以看出,二进制数只有两个状态0和1,二进制数的这个特质非常适合描述电路的通与短、开关的打开与关闭,计算机的电路都是由电子器件组成的,电子器件的状态也分为0(低电位)和1(高电位),二进制的特征正好满足了计算机中电子器件的运算要求,因此计算机内部运算都采用二进制运算,能够识别的数也是二进制数。

    计算机能够识别的数制是二进制数,二进制数是用0和1两个数字来表示的数,计算机的指令集也是采用二进制表示,机器语言就是用二进制数来编写程序。

    可以借助十进制数来理解二进制数。在十进制中,最开始学习的是十以内的加法,之后是两位数的加法,在两位数加法的学习中,就需要逢十进一了,按进位的原则进行记数的方法叫做进位记数制,也称为“数制”或“进制”。

    我们平时用的最多的就是十进制,时间是六十进制,也就是说逢六十进一,例如60秒进1分,60分进1小时。因此每一种数制的进位都遵循一个规则,那就是——逢n进1。这里的n叫做基数。

    在十进制中,每一位有0、1、2、3、4、5、6、7、8、9十个数码,因此基数为10,超过9就必须用多位数来表示,并遵循逢十进一的原则。一个任意的十进制数可以表示为:

    blob.png

    其含义是:

    blob.png

    其中ai(i=0,1…,n),bj(j=1,2,…,m)是0、1、2、3、4、5、6、7、8、9十个数码中的一个。

    上式中相应于每位数字的10n称为该数字的权,其大小是以基数为底,数码所在位置的序号为指数的整数次幂。

    例如:十进制数1111.111

    这个十进制数的7个位数虽然都是1,但是每个位数1表示的数值意义不同,从左往右数第一个1表示blob.png,第二个1表示blob.png

    ,……,第7个1表示0.001=10-3,每个位数表示的数值叫做位权,也就是基数的n幂。十进制数1111.111以小数点为界,整数部分自右向左,依次是基数的0次、1次、2次、3次幂。小数部分,自左向右,分别是基数的-1次、-2次、-3次幂。每位数字乘以其权所得的乘积之和即为所表示数的值。

    例如:

    blob.png

    十进制是人们最熟悉、最常用的一种数制,但它不是唯一的数制。例如计时用的时、分、秒就是按60进制计数的。基数为r的r进制数可以表示为:

    blob.png

    二进制和十六进制数

    计算机就其本身来说是一个电器设备,为了能够快速存储、处理、传递信息,其内部采用了大量的电子元件,在这些电子元件中,电路的通和断、电压高低,这两种状态最容易实现,也最稳定、也最容易实现对电路本身的控制。计算机工程师将计算机所能表示这样的状态,用0,1来表示、即用二进制数表示计算机内部的所有运算和操作。二进制数运算非常简单,计算机很容易实现,所以计算机内部都用二进制编码进行数据的传送和计算。

    二进制的基数为2,只有0、1两个数码,并遵循逢二进一的原则,它的各位权是以2k表示的,因此二进制数blob.png的值为:

    blob.png

    其中ai,bj为0、1两个数码中的一个。例如:

    blob.png

    其中数的下标表示该数的基数r,即二进制的101101与十进制的45等值。

    n位的二进制数可以表示2n个数。例如:3位二进制数可以表示8个数,分别是:

    1.  
      二进制数 相对应的十进制数
    2.  
      000 0
    3.  
      001 1
    4.  
      010 2
    5.  
      011 3
    6.  
      100 4
    7.  
      101 5
    8.  
      110 6
    9.  
      111 7

    而4位二进制数则能表示十进制的0 ~ 15共16个数如下:

    二进制数    相对应的十进制数
    0000          0
    0001          1
    0010          2
    0011          3
    0100          4
    0101          5
    0110          6
    0111          7
    1000          8
    1001          9
    1010          10
    1011          11
    1100          12
    1101          13
    1110          14
    1111          15

    为了方便阅读及书写,经常使用十六进制来表示二进制数,十六进制的基数是16,数码为0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F,其中用A,B,C,D,E,F(字母不区分大小写)这六个字母来分别表示10,11,12,13,14,15。

    按同样的方法,可以很容易地掌握十六进制数的表示方法。例如:

    blob.png

    在计算机编程语言中,通常用数字后面跟一个英文字母来表示该数的数制。十进制一般用D(Decimal)、二进制数用B(Binary)、十六进制用H(Hexadecimal)来表示。例如:23AH、570D、110101B、0075H,…。当然也可以用这些字母的小写形式。

    不同进制数的相互转换

    计算机中采用的是二进制,但用计算机解决实际问题时对数值的输入输出通常使用十进制,这就有一个十进制向二进制转换或由二进制向十进制转换的过程。也就是说,在使用计算机进行数据处理时首先必须把输入的十进制数转换成计算机所能接受的二进制数;计算机在运行结束后,再把二进制数转换为人们所习惯的十进制数输出。

    1、二进制数转换成十进制数  

     把二进制数转换成十进制数就是用“按权相加法”,把二进制数首先写成加权系数展开式,然后按十进制加法规则求和。

     例:把二进制数110.11转换成十进制数。 

    blob.png

    2、十进制数转换为二进制数 

      前面“按权相加法”中,权的值在小数点左边和小数点右边是不一样的。所以,十进制数转换为二进制数时,整数和小数的转换方法也不同,一般先把十进制数的整数部分和小数部分分别转换后,再加以合并。

    十进制整数转换为二进制整数采用"除2取余,逆排序"法。具体做法是:用2去除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为零时为止,然后把所有余数按逆序排列,也就是把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。这就是所谓“除2取余,逆序排列”。

    例:将一个十进制数25转换为二进制数。

     

       blob.png           

                                   

    3、十六进制和二进制之间的转换

    由于十六进制的基数是2的幂,所以这两种数制之间的转换是十分容易的。一个二进制数,只要把它从低位到高位每4位组成一组,直接用十六进制数来表示就可了。

    例:0011  0101  1011  1111 = 35BF

          3     5     B     F

    反之,把十六进制数中的每一位用4位二进制数表示,就形成相应的二进制数了。

                  A     1     9     C

    例:A19C = 1010  0001  1001  1100

    4、十六进制数转换为十进制数

    同二进制数转换十进制数相同,各位十六进制数与其对应权值的乘积之和即为与此十六进制相对应的十进制数。

    blob.png

    十进制数转换为十六进制数也可使用除法进行。

    二进制数是逢二进位的进位制,0、1是基本算符,计算机运算基础采用二进制。编程过程中经常会用到十六进制,而十进制的使用非常少,这是因为十六进制和二进制有天然的联系:四个二进制位可以表示从0到15的数字,这刚好是1个16进制位可以表示的数据,也就是说,将二进制转换成十六进制只要每4位进行转换就可以了。

     

    ■ 课程小结

    1、二进制只有两个数字,就是0和1,类似开关的接通和断开。计算机里面的芯片都是电子电路,也只有两种状态,高电位(通电)和低电位(断电),因此用二进制表示电子电路的状态是最合适不过了,不用任何翻译过程,电子电路会自动识别用二进制语言写的代码。

    2、二进制和其它进制是可以互相转换的,如十进制和十六进制,具体转换方法课程已经介绍的比较详细了。这里主要说一说为什么进制间要相互转换?我们知道计算机内部是用二进制表示的,但人们用计算机工作时,输入的都是十进制数和字符,这就需要把人们输入的数据通过处理程序转换为计算机能够识别的二进制数。同样的道理,当人们需要从计算机查询信息时,处理程序就需要把二进制数转换成人们能够容易识别的十进制数或者字符。

    从转换过程看,好像没有十六进制的事,其实十六进制是为了方便编程人员编写代码而提供的,主要是在编程语言中,用十六进制表示数值特别方便,可以以较少的数位表示较大的数,而且十六进制和二进制的转换也非常方便,因此程序员更喜欢在代码中用十六进制表示数值。

     

    ■ 思考与练习

    1、将下列二进制数转换为十六进制数和十进制数:

    (1)10101   (2)10000000  (3)11111111

    2、用除法将下列十进制数转换为二进制数和十六进制数:

    (1)369    (2)10000   (3)4095

    3、将下列十六进制数转换为二进制数和十进制数:

    (1)FA     (2)5B     (3)F234

    展开全文
  • 详细讲述C语言各种进制转换、互转原理,附件有实例。
  • 十六进制转换十进制原理介绍 十六进制转换为十进制,是先要将十六进制转换为二进制,在通过二进制转换为十进制。 十六进制转换为二进制很简单,我们首先要明白,一位十六进制代表四位二进制,如F对应二进制的1111,A...

    十六进制转换十进制原理介绍

    十六进制转换为十进制,是先要将十六进制转换为二进制,在通过二进制转换为十进制。
    十六进制转换为二进制很简单,我们首先要明白,一位十六进制代表四位二进制,如F对应二进制的1111,A代表二进制的1010,利用这种一一对应的关系,很容易就把十六进制转换为二进制,如0x1F6C,其中十六进制1对应二进制0001,十六进制F对应二进制1111,十六进制6对应二进制0110,十六进制C对应二进制1100,那么十六进制数0x1F6C对应的二进制数就是0001 1111 0110 1100。
    得到对应的二进制数后,再将二进制转换为十进制,这一步就更简单了,只需要套一个公式即可,二进制右边为低位,左边为高位,最右边的第一个数代表2的0次方,自右往左依次递增,1、2、3、4…,十六位的二进制数最高位就是2的16 - 1 = 15次方(因为最低位从0开始),将二进制每一位上的数作为系数,与该位对应的次方相乘,再将所有位算得的结果相加,最后得到的数便是二进制对应的十进制数。我们拿0001 1111 0110 1100为例,公式便为f=020+021+122+123+024+125+126+027+128+129+1210+1211+1212+0213+0214+0215f = 0*2^0 + 0*2^1+1*2^2 + 1*2^3+0*2^4 + 1*2^5+1*2^6 + 0*2^7+1*2^8 + 1*2^9+1*2^10 + 1*2^11+1*2^12 + 0*2^13+0*2^14 + 0*2^15最后算得f = 8044,那么8044就是二进制0001 1111 0110 1100所对应的十进制数,同样也是十六进制数0x1F6C对应的十进制数。
    我们通篇以十六位的数来讲解的,其余位的数举一反三即可,原理相同。

    代码实现

    有了相关的知识之后,我们便可以很容易将代码实现

    #include "stdio.h"
    #include "math.h"
    unsigned short int DecData_16[4];      //用于存储十进制数,数组的大小根据自己的实际情况进行修改
    /* -------------------十六进制(十六位)转换为十进制--------------------- */
    void Hex2Dec_16(unsigned short int* temp)
    {
    	for(int i = 0;i < 4;i++)    //这里是4个十六进制数,所以只循环四次,根据自己的实际情况修改
    	{
    		unsigned short int Hex = temp[i];
    		unsigned short int Dec = 0;
    		for(int j = 0;j < 16;j++)   //16表示一个十六进制数一共16位,根据自己的实际情况进行修改
    		{
    			if(Hex & 0x0001)   //判断十六进制数对应的二进制的最后是0还是1,所以十六进制转换为二进制这一步工作代码暗中就已经实现了
    			{
    				Dec += pow(2,j);    pow(2,j)是math.h头文件里的库函数,进行次方运算
    				Hex >>= 1;   //这里的移位操作是对十六进制对应的二进制进行操作,不需要我们进行转换
    			}
    			else   //如果最后一位不是1
    			{
    				Dec += 0;   //则加0
    				Hex >>= 1;
    			}
    		}
    		DecData_16[i] = Dec;
    	}
    }
    

    到此为止我们便实现了十六进制到十进制的转换,关于十进制转换为十六进制,请参考链接: STM32 十进制转换成十六进制的实现(有例程),在Keil5里面用C语言实现,不用scanf函数.

    展开全文
  • C语言 实现16进制 转换10进制

    千次阅读 2020-03-19 00:16:31
    原理:2、8或16进制转换成10进制都是用对应的进制数从后向前(从个位向前)依次乘以对应进制数的增长幂数然后求和。 例如16进制转10进制 : ABC=10*16^2+11* 16^1+12*16^0=2748 代码: #define _CRT_SECURE_...

    程序说明:输入一个16进制的数,输出一个10进制的数

    原理:2、8或16进制转换成10进制都是用对应的进制数从后向前(从个位向前)依次乘以对应进制数的增长幂数然后求和。

               例如16进制转10进制  :

                     ABC=10*16^2+11* 16^1+12*16^0=2748

    代码:

    #define _CRT_SECURE_NO_WARNINGS 
    #include<stdio.h>
    #include<stdlib.h>
    #include<string>
    int trans(char *p){
    	int len, sum = 0;
    	len = strlen(p);
    	for (int i = 0; i < len; i++){
    		if (p[i] >= 'a' && p[i] <= 'f')
    			sum =sum+ (p[i] - 'a' + 10)*pow(16, len - i - 1);
    		else if (p[i] >= 'A' && p[i] <= 'F')
    			sum += (p[i] - 'A' + 10)*pow(16, len - i - 1);
    		else
    			sum += (p[i] - '0')*pow(16, len - i - 1);
    	}
    	return sum;
    }
    int main(){
    	char p[10];
    	int num;
    	gets(p);
    	num = trans(p);
    	printf("%d", num);
    
    	system("pause");
    	return 0;
    }

    运行结果:

    展开全文
  • 递归:递归的原理,就是自己调用自己本身。存在一个顺序的问题,如果在递归前的是顺序执行,递归后的是逆序执行,如下... 下面实现进制转换就是利用的这个原理。 代码如下: #include<stdio.h> #includ...

      递归:递归的原理,就是自己调用自己本身。存在一个顺序的问题,如果在递归前的是顺序执行,递归后的是逆序执行,如下: 

    void gogogo()
    {
        //递归之前
        gogogo();
        //递归之后
    }
    递归

      下面实现进制转换就是利用的这个原理。

          代码如下:

    #include<stdio.h>
    #include<stdlib.h>
    void  toletter(int num)
    {
        switch (num)
        {
        case 10:
            printf("%c", 'a'); break;
        case 11:
            printf("%c", 'b'); break;
        case 12:
            printf("%c", 'c'); break;
        case 13:
            printf("%c", 'd'); break;
        case 14:
            printf("%c", 'e'); break;
        case 15:
            printf("%c", 'f'); break;
        default:
            printf("%d", num); break;
        }
    }
    //十进制转二进制
    void convertto2(int num)
    {
        if (num ==1|| num==0)
        {
            printf("%d",num);
        }
        else
        {
          int n=num / 2;
          convertto2(n);
          printf("%d",num %2);//如果把这句话放在convertto2(n);之前就是顺序执行,显示是逆序,所以实现了余数的倒序排列。
        }
    }
    //十进制转八进制
    void convertto8(int num)
    {
        if (num  < 8)
        {
            printf("%d", num);
        }
        else
        {
            int n = num / 8;
            convertto8(n);
            printf("%d", num % 8);
        }
    }
    //十进制转十六进制
    void convertto16(int num)
    {
        if (num<16)
        {
            toletter(num);
        }
        else
        {
            int n = num / 16;
            convertto16(n );
            toletter(num % 16);
        }
    
    }
    
    void main()
    {
        int num;
        printf("请输入一个整数");
        scanf_s("%d",&num);
        printf("\n十进制转二进制:");
        convertto2(num);
        printf("\n十进制转八进制:");
        convertto8(num);
        printf("\n十进制转十六进制:");
        convertto16(num);
        system("pause");
    }

     递归图解

    转载于:https://www.cnblogs.com/wangliu/p/4076856.html

    展开全文
  • 原理:N = (N div d) * d + N mod d;源码如下:#include#include#ifndef TRUE#define TRUE 1#endif#ifndef FALSE#define FALSE 0#endiftypedef struct Stack{int data;struct Stack *next;}Stack, *StackList;Stack...
  • 首先介绍一下进制转换原理:除基取余法。 设十进制数为N,转换的进制为d,则N=(n/d)%d+n%d,就是说:输入一个十进制数N,每次用N除以2,把余数记下来,再用商去除以2...依次循环,直到商为0结束,把余数倒着依次排列...
  • 实现原理:y=a1P^(n-1) + a2P^(n-2)+…+a(n-1)*P+an int y=0,product=1; while(x != 0){ y = y + (x%10) * product x = x/10; product = product * P; } 二、10进制数y>Q进制数z 除基取余法 int z[40],num=0; ...
  • 进制转换算法的C语言实现

    万次阅读 2014-11-06 16:30:22
    下面就来详细说明各进制之间的转换原理。 (一)二、八、十六进制转十进制 2、8、16转10有一个通用的算法,就是用各位上的数乘以本进制的基数的n次幂(n为本位数后面的位数)求值后相加所得。有点绕口是吧?...
  • 进制转换C源码

    2013-01-25 14:29:32
    进制转换C源码 根据毕向东Java基础教程中讲解的进制转换原理写出来的C语言代码,C语言还是和Java差别太大,没有无符号右移>>>太难搞了,不过还算搞定了吧
  • C语言进制知识汇总

    2021-01-20 07:05:52
    遵循满进制值进1位,个位数变为0的原理,下面我们以十进制数18为例,对1-18中每一个数值转换各种进制做一个详细说明 转二进制: 1小于2,无需进1位,1的二进制值是1 2为二进制值1后面一个数,由于1+1
  • 进制转换exe程序+C源码.rar 根据毕老师的Java基础课程讲解的原理C语言写的
  • ******************编译原理******************* ***********************命名********************* 变量名:字母数字下划线,只能以字母和下划线开始;变量名中不能有#,可以有$;区分大小写;不能用C语言中的...
  • 进制转换成十六进制数~C语言

    万次阅读 2017-10-28 16:56:49
    /*****原理:1,首先知道0b100000 = 0b10000*2 = 0b1000*2 = 0b100*2 =0b10*2 利用这一特性能将char型的数字转换成10进制表示,比如:0b1111转换成15 **** */ /***** 2,15以内的十进制数输出成
  • (4) 空栈、入栈、出栈、取栈顶元素等操作(5) 栈的实际应用,进制转换 2.程序源码#include "stdafx.h"#include "stdio.h"#include "malloc.h"#include "stdlib.h"#define stack_size 5 //存储空间初始分配量
  • 原理: N = (N div d) * d + N mod d;
  • 进制 1.默认就是10进制 2.在前面加上一个0就代表八进制 3.%d是以十进制的方式输出一个整数 4.%o是以八进制的方式输出一个整数 ...5.在数值前面加上0b就代表二进制 ...转换原理:除2取余 倒序读取
  • 将十进制数N和其它d进制数的转换是计算机实现计算的基本问题,其解决方案很多,其中最简单方法基于下列原理:即除d取余法。
  • 进制数 N 和其他 d 进制数 M 的转换是计算机实现计算的基本问题,其解决方法很多,其中一个简单算法是逐次除以基数 d 取余法,它基于下列原理: N = (N div d )*d + N mod d 具体作法为: 首先用 N 除以 d,得到的...
  • 原理大致是将PE文件中的ASCII转换成HEX输出到文本中。这样做的目的是为了保存病毒样本的时候不会被杀毒软件查杀!然而却是delphi写的,特别想用C语言自己也实现一个,于是从google翻出了此代码。 2、编译后的结果 3...
  • 这里写自定义目录标题## int型数据向char型数据强制转换原理 ## int型数据向char型数据强制转换原理 C语言中int是四个字节,char是1个字节,占字节多的int型向字节少的char型强制类型转换的原理就是字节截断。 转换...
  • 大家都知道计算机只能处理和识别二进制指令,而我们利用各种高级编程语言所编写的程序,要经过一些列的处理步骤,最终转变为汇编指令,再最后转变为机器指令。 以上这些转变是如何发生的就属于大名鼎鼎的...
  • 当然点鼠标大家都会,可能转换C语言,代码对这些进制进行转换的时候会遇到这个或者那个的问题。 这里简单写了一个各种进制之间的转换函数,当然目前仅实现了二进制,八进制,十进制和十六进制,而且关于扫描...
  • 如何用C++/C将一个N进制数转化为一个十进制数?...借用以上规律,可用C++/C语言由N进制转换为10进制。 不多bb,直接上代码,这里举例的只是4位数的转换,怎么转换任意位数,就留给你们自己思考了。 #inc...
  • C语言编译原理

    2020-07-19 16:24:13
    C程序的生命周期是从一个高级C语言程序开始的,因为这种形式能够被别人读懂。然而,为了在系统上运行.c程序,每天C语句都必须被其他程序转化成为系列的低级机器语言指令。然后这些指令一种称为可执行目标程序的格式...
  • C语言按位取反原理

    2021-03-26 17:18:32
    正数取反是先将初始数值转换成二进制数(6==》00000110),再对二进制数的每一位取反:即将0变为1、将1变为0。(00000110==》11111001),得到的是最终结果的补码,要转换为最终结果的原码则需再次取补码,就能得到...
  • c语言读取图片原理:通过文件流的方式读入到Byte的二进制数组中,之后,使用图像分析算法将图像显示到屏幕上,要将数e799bee5baa6e59b9ee7ad9431333363393564组中的值转换为像素。
  • 实验任务从ADC0804的通道IN+输入0-5V之间的模拟量,通过ADC0804转换成数字量在数码管上以十进制形成显示出来。二.实验原理ADC0804是8位全MOS 中速A/D转换器、它是逐次逼近式A/D转换器,片内有三态数据输出锁存器,...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 141
精华内容 56
关键字:

c语言进制转换原理

c语言 订阅