精华内容
下载资源
问答
  • 这一篇文章要探讨的是“如何用算法实现十进制十六进制”并不涉及什么特别的知识点。属于C语言基础篇。 在翻找素材的时候,发现一篇以前写的挺有意思的代码,这篇代码里面涉及的知识点没有什么好讲的,也没有什么...

    在这里插入图片描述
    这一篇文章要探讨的是“如何用算法实现十进制转十六进制”并不涉及什么特别的知识点。属于C语言基础篇

    在翻找素材的时候,发现一篇以前写的挺有意思的代码,这篇代码里面涉及的知识点没有什么好讲的,也没有什么特别的逻辑概念在里面,仅仅只是想要分享一下个人对于编程方面的一些思考和坚持而已。


    先看代码:

    #include <stdio.h>
    #include <string.h>
    int Judge(int n);
    int Detection(void);
    
    int main(void)
    {
    	char x[16] = {'0','1','2','3','4','5','6','7','8',
    			'9','a','b','c','d','e','f'};//十进制与十六进制对应的数组
    
    	printf("请输入一个十进制的数:");
    	int n = Detection();//输入数据检查再赋值
    	int k = Judge(n);//检测数组需要的长度
    	char y[k];//创建数组储存十六进制数
    	memset(y,'\0',sizeof(y));//清空数组
    
    	int i,j;
    	j = 0;
    	while( n >= 16 )//把转换好的十六进制数依次输入数组
    	{
    		i = (n % 16);//先是求余
    		y[j] = x[i];//把得到的余数转为十六进制数(例如“11”转“b”)
    		j++;//数组下标移位
    		n /= 16;//求商再赋值给它自己(方便下个循环再除)
    		if(n < 16)
    			y[j] = x[n];
    	}
    
    	//此时数组y内的十六进制数是倒过来储存的
    	
    	printf("你输入的数转换成十六进制为:0x");//先输出“0x”前缀
    	while(j >= 0)//把储存了十六进制数的数组倒着输出
    	{
    		if(j > 0)//判断是不是最后一个,是的话换行
    			printf("%c", y[j]);
    		else
    			printf("%c\n",y[j]);
    		j--;
    	}
    
    	return 0;
    }
    
    int Judge(int n)//这个函数的作用是用来判断需要定义的数组大小的
    {
    	int k = 1;
    	int m = n;
    	while(m > 16)//如果小于16,那么1位就行了
    	{
    		m /= 16;//如果大于16先除与16
    		k++;//加一位
    	}
    	return k;
    }
    
    int Detection(void)//这个是第一篇博客里面的那个代码的封装版,用来保证输入的数为合法
    {
    	int n;
    	while(1)
    	{
    		if(scanf("%d", &n) != 1 || getchar() != '\n')
    		{
    			printf("你输入的数据有误,请再输一遍:");
    			while(getchar() != '\n');
    		}else
    			break;
    	}
    	return n;
    }
    

    这篇代码所要实现的功能很简单,就是把十进制转换为十六进制输出,当然也是有前提的,就是不能用那些转换符(例如%x)或者用一些现有的函数,需要自己写一个算法来实现转换。至于这个算法也不难,无非就是了解一下在数学上面如何把十进制转为十六进制,然后把那个过程用代码来实现罢了,网上已经有很多说明了。十进制转其他进制最常用的办法就是不断对其要求的进制数求余,然后余数反转。

    大概类似于这个样子的过程(灵魂画师附体)
    在这里插入图片描述


    这个过程在算法上面具体体现为先获取用户的十进制输入,然后不断的对其与16进行求商求余,把得到的余数反转输出,即为所要求的十六进制数。在这个过程中,由于需要把余数反转输出,没法每求一个余数就输出一个。所以就需要一个数组来存储这些已经求得的余数,然后再反向输出。在这整个输出的过程中,所涉及算法的难度并不大。但如果仅仅只是这样的话,我也没有必要专门写一篇文章来分享这个代码了。
    在这里插入图片描述


    我在写这个代码的时候,遇到一个问题,是关于数组的。既然我在输出之前需要把余数用数组储存起来,那么我这个数组需要定义多大呢?由于用户的输入并不确定,所以最终所得到的十六进制数也不确定,这样也就没有办法事先知道我需要的数组大小。定义大了浪费空间,定义小了又不够放。当初在做这道题的时候,老师给我们的建议是定义个“char x[20]”就可以了。

    我当时的第一反应就是,老师这是在给我们降低难度啊,这么随便的吗?万一用户输入的数据转换为十六进制之后超过20位呢?且不说浪费不浪费空间的问题,你这明显就是存在着bug啊!怎么也得要给个1024吧,20哪里够了。不过后来想想,如今的操作系统也就64位,转换成十六进制的话,也就16个数就可以表示完了,连20都给多了,四舍五入刚好取整嘛。而且也没有bug的存在,也就浪费了4个字节的内存而已。要是我当时意识到这点,我可能就会直接“char x[16]”完事。也就没有后面的什么事了。

    不过在当时的我看了来,这简直就是一个要逼死强迫症的bug啊!我可以容许浪费空间,也可以容许效率低下,但是绝不能放任bug不管啊。所以,我那天苦思冥想,最终认识到,我需要的是一个可变数组。这个数组要能够实现我放多少东西进去它就能存多少东西,我拿多少东西出来它就能缩小多少。为了实现这个需求,我上网找了一下可变数组的实现方法。但是不外乎两种情况,一种是在说C语言中没有可变数组另一种就是在用代码实现可变数组。只可惜我当时的技术水平有限,实在是看不懂那些天书,而且那些大佬的代码一长,就不写注释的了,通篇博客就一整篇代码,一点介绍性的文字都没有,别说我当时没那个技术看不懂啊,我就是现在看的懂也没耐心看你这么一整篇没有注释的代码啊!简直神烦(这也是我想要写博客的一个原因)。


    所以我当时在这模凌两可的网络环境下面,我认为是有可变数组的,只是藏着某个函数库里面而已,只是属于深度C而已,只是我还没有学到而已,于是那一整个下午我就都在探索可变数组。

    直到后来我才知道,在C语言里面,本身就不存在什么可变数组,在C++中倒是存在可变数组的概念,网络上面的所谓可变数组,不过是利用了指针来存储好原数组的内存位置然后当再次需要改变数组大小的时候,在原位置上面创建或者把原数据拷贝到新的内存地址上面再返回新地址的值给原指针而已。说白了,就是假的,假的。根本就不存在什么可变数组。C语言本身就不支持可变数组这个功能。


    直到的最后,当然是没有成功啦,本来就是不存在的东西,不过现在想想用储存原数组地址这个方法来实现可变数组用在我这篇代码中或许也很合适,虽然我用的方法是在数据输入之后先判断一下需要的数组大小,然后再创建数组的方法。不过那也是我当时的权宜之计而已,
    在这里插入图片描述


    有意思的是当初我在不知道C语言中有没有可变数组的时候,曾想过用“指针对于非法内存的访问”来实现可变数组。具体表现可以看下面的代码

    int main(void)
    {
    	int i = 0;
    	char a[i];//根本没有分配空间,用“i”代替0是为了防止编译器报警告
    	char *c = a;//用一个指针来存储数组“a”的地址值
    	int j = 3;
    	a[j] = '7';//这里用“j”来代替3是为了防止编译器报警告
    
    	printf("%c ", c[3]);//这里用“c”来代替“a”输出也是为了防止编译器报警告
    	printf("\n");
    
    	return 0;
    }
    

    在这段代码里面数组“a”我根本没有分配空间给它,但是我却给它第3个位置“a[3]”赋值,居然编译通过了,运行也没有问题。这就是利用了指针对于非法内存的访问来实现的,而且这样也可以满足我的需求,我这个数组即没有大小限制的而且也丝毫不浪费内存,这不就是我想要的可变数组吗?

    但别以为这是什么好东西,恰恰相反在编程开发的时候,我们应该要去杜绝这种情况的发生。这段代码在不同的电脑下面或者在不同的程序区域下面运行都有可能不一样,你可以尝试把它封装成一个独立函数,然后试着在另外一篇小规模的代码上面调用试试看,可能在程序的开始调用它,程序就会报段错误,也有可能会在程序的尾部调用它,程序就报段错误了。也有可能整个程序执行完到退出,也没有报段错误。什么时候报段错误,完全取决于CPU在执行你这个程序的过程中什么时候访问到你正在使用的那块非法内存

    你的代码一运行就报错不可怕,最可怕的就是这种随机性报错的,你无法准确定位到你的错误位置。想象一下,你代码原本运行的好好的,你突然想给它来个优化,就好像把原本的int形数据改为char形的节省一下空间,或者改一下别的无关痛痒的细节,改完之后吧,你一编译运行,报错了,你就找啊找啊找啊,就是找不到在哪里有错误。
    然后你就很不甘心的把代码又改回去,但是你忽略了一个细节,你原本是先定义一个char类型的数据“a”然后再定义一个int类型的数据“b”的,但是你为了好看,你在优化的时候把它们改成了先定义“b”再定义“a”了。但是你在改回去的过程中觉得不可能是这里的问题啊,就没管了,结果编译运行后,还是报错。
    这时候你对着整篇代码从头看到尾,又从尾看到头,你看了好几遍,但就是不知道到底是哪里出了问题,明明跟原来的代码一摸一样啊,怎么就还是报错呢?这时候打死你也不会相信,就是因为你改变了那两个变量的定义顺序了,使得整个程序在内存中的储存结构发生了改变,这就造成了程序在运行的过程中访问到了原本不会访问的内存,而那块内存正是你用的非法内存。

    所以当时我在把这个思路运用到代码里面的时候,就出现了很多奇奇怪怪的问题,程序有时候行,有时候不行。有的时候甚至会出现同一个代码在我的电脑上面运行还可以一放到别人的电脑上面就有不行了这种情况,更夸张的是有时候上午运行可以,下午运行又报错了。搞了半天,放弃了。直到后来知道了野指针的概念之后,才渐渐知道为什么会出现那种情况。对于野指针的分析,以后有机会我可能还会单独写一篇文章来说明吧,也可能不会。虽然野指针还是挺重要的一个概念的,不过也挺简单,好像也没什么好写的。


    好了,就写到这里吧,确实没有什么知识点好说的,只是单纯的想要分享一下以前的一些有趣的事情而已。而且如果你刚好需要做一道编程题叫做”请用算法编程实现十进制数转XX进制数“的时候,这篇代码刚好可以套用嘛!不过不建议抄作业啦!参考参考就可以了,毕竟真没有什么难度的这题,注释代码里面都写明白了,应该也不会存在看不懂的现象,过些天我会尝试性的把这个例子改为用“储存原数组地址来实现可变数组”的方法来实现,然后再更新上来。

    最后附上这个例子的精简版代码:

    #include <stdio.h>
    #include <string.h>
    int Judge(int n);
    int Detection(void);
    
    int main(void)
    {
    	char x[16] = {'0','1','2','3','4','5','6','7','8',
    			'9','a','b','c','d','e','f'};//十进制与十六进制对应的数组
    
    	printf("请输入一个十进制的数:");
    	int n = Detection();//输入数据检查再赋值
    	int k = Judge(n);//检测数组需要的长度
    	char y[k];//创建数组储存十六进制数
    	memset(y,'\0',sizeof(y));//清空数组
    
    	int i,j;
    	for(j=0; n > 0; j++)//把转换好的十六进制数依次输入数组
    	{
    		i = (n % 16);
    		y[j] = x[i];
    		n /= 16;
    	}
    
    	printf("你输入的数转换成十六进制为:0x");
    	while(j >= 0)//把储存了十六进制数的数组倒着输出
    		printf("%c", y[--j]);
    	printf("\n");
    	return 0;
    }
    
    int Judge(int n)//这个函数的作用是用来判断需要定义的数组大小的
    {
    	int k;
    	for(k=0; n>0; ++k)
    		n /= 16;
    	return k;
    }
    
    int Detection(void)//这个是第一篇博客里面的那个代码的封装版,用来保证输入的数为合法
    {
    	int n;
    	while(1)
    	{
    		if(scanf("%d", &n) != 1 || getchar() != '\n')
    		{
    			printf("你输入的数据有误,请再输一遍:");
    			while(getchar() != '\n');
    		}else
    			break;
    	}
    	return n;
    }
    

    零BUG是原则性问题。

    展开全文
  • 展开全部一、转换的32313133353236313431303231363533e59b9ee7ad9431333365653163思路分析:4个2进制位为一个16进制数,2进制1111为16进制F,2进制中千位的1=8,百位的1=4,位的1=2,个位的1=1,将各个位的数作...

    展开全部

    一、转换的32313133353236313431303231363533e59b9ee7ad9431333365653163思路分析:4个2进制位为一个16进制数,2进制1111为16进制F,2进制中千位的1=8,百位的1=4,十位的1=2,个位的1=1,将各个位的数作相应转换再相加,的到的数就是10进制数0-15,可轻松转换成16进制。如01011100,可看成是两组2进制数0101和1100,则这个数就是16进制的5C。

    二、例子:

    用位加权乘,积相加法比较简单。如8FFC035B转换为十进制(最低位是16^0,依次向左):

    1、8FFC035B(16)=8x16^7+Fx16^6+Fx16^5+Cx16^4+0x16^3+3x16^2+5x16^1+Bx16^0

    2、=2147483648+15x16^6+15x16^5+12x16^4+0+768+80+11

    3、=2147483648+251658240+15728640+786432+768+80+11

    4、=2415657819(10)。

    三、关于二进制

    1、二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹发现。当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。计算机中的二进制则是一个非常微小的开关,用“开”来表示1,“关”来表示0。

    2、20世纪被称作第三次科技革命的重要标志之一的计算机的发明与应用,因为数字计算机只能识别和处理由‘0’.‘1’符号串组成的代码。其运算模式正是二进制。19世纪爱尔兰逻辑学家乔治布尔对逻辑命题的思考过程转化为对符号"0''.''1''的某种代数演算,二进制是逢2进位的进位制。0、1是基本算符。因为它只使用0、1两个数字符号,非常简单方便,易于用电子方式实现。

    展开全文
  • 十进制数转为十六进制字符串

    万次阅读 2017-07-06 19:43:00
    面试中经常有相关进制转换的面试题,工作中也涉及到了。比如数据传输的时候就需要转换成16进制,不过那是字符串,我们这里说整形。 #include #include char CODE[]="123456789ABCDEF"; void toHex(int a) { int ...

                   面试中经常有相关进制转换的面试题,工作中也涉及到了。比如数据传输的时候就需要转换成16进制,不过那是字符串,我们这里说整型。

    #include<stdio.h>
    #include<stdlib.h>
    
    char CODE[]="123456789ABCDEF";
    
    void toHex(int a)
    {
       int high,low,i=0,result;
       char str[10];
       if(a <= 0 || a > 255)
    	  exit(0);
    
       high=a >> 4;  //取二进制位的前4位
       low=a & 15;   //取二进制位的后4位
    
       str[i++]=CODE[high-1];
       str[i++]=CODE[low-1];
       str[i]='\0';
    
       printf("str=%s\n",str);
    }
    
    int main()
    { 
       int a=26; 
       toHex(a);
    
       return 0;
    }
    打印:str=1A


    首先是十进制转换为2进制,这个2进制一定是4的整数倍。将这组二进制按4个位进行划分,可以划分为n个组,每个组对应的值就是十六进制各个位对应的值。上述代码只考虑了8个二进制位的情况

    比如:26 ,其二进制为:0001 1010 ,左边4个二进制位的值是1,右边4个二进制的值是10,对应就是A,所以26的十六进制数为1A 。






    展开全文
  • 展开全部十六进制十进制:从个位起第i位乘以32313133353236313431303231363533e58685e5aeb93133336338343116的i-1次方比如0x233 = 2*16^2 + 3*16^1 + 3*16^0 = 512 + 48 + 3 = 5630x666 = 6*16^2 + 6*16^1 + 6*16^...

    展开全部

    十六进制转十进制:

    从个位起第i位乘以32313133353236313431303231363533e58685e5aeb93133336338343116的i-1次方

    比如

    0x233 = 2*16^2 + 3*16^1 + 3*16^0 = 512 + 48 + 3 = 563

    0x666 = 6*16^2 + 6*16^1 + 6*16^0 = 1536 + 96 + 6 = 1638

    0x7FFF = 7*16^3+15*16^2+15*16^1+15*16^0=28672+3840+240+15=32767

    十进制转十六进制:

    除十六取余数

    比如

    233 ÷ 16 = 14 ......9

    14 ÷ 16 = 0 ......14

    倒着写就是0xE9

    32768 ÷ 16 = 2048 ......0

    2048 ÷ 16 = 128......0

    128 ÷ 16 = 8......0

    8 ÷ 16 = 0......8

    倒着写就是0x8000

    算法实现:

    十六进制转十进制:

    #include

    #include

    char buf[20];

    int len,_pow,ans=0;

    int trans(char hex)

    {

    if (hex>='0'&&hex<='9') return hex-48;

    if (hex>='a'&&hex<='f') return hex-87;

    if (hex>='A'&&hex<='F') return hex-55;

    return 0;

    }

    int main(){

    scanf("%s",buf);

    len = strlen(buf);

    _pow = 1;

    for (int i=len-1;i>=0;i--)

    {

    ans = ans + trans(buf[i]) * _pow;

    _pow = _pow <

    }

    printf("%d\n",ans);

    return 0;

    }

    十进制转十六进制:#include

    char trans(int deci)

    {

    if (deci<10) return deci+48;

    return deci+55;

    }

    int n,len=0;

    char hex[20];

    int main(){

    scanf("%d",&n);

    while(n)

    {

    hex[len++] = trans(n&15);

    n=n>>4;

    }

    for (int i=len-1;i>=0;i--)

    putchar(hex[i]);//跟手算一样,要倒着输出

    return 0;

    }

    展开全文
  • 十进制数转化为其它进制 1.十进制转化为二进制数 十进制数15 上图中箭头的方向即为二进制数中从低位到高位(从右往左)的顺序, ...二进制数为:0000 0000 0000...3.十进制数转化为十六进制数 十六进制数为0,1,...
  • 匿名用户1级2017-11-28 回答#首先说明一点,python有现成的函数可以干这个,只不过这个位数不会按照你想要的位数输出而已#这些函数是bin(),hex(),oct(),这些函数自己去看它的源码实现。#个人写的如下defaddone(mods)...
  • 本文收藏整理在SQL中使用sql实现进制转换,如:十进制转为十六进制、十六进制转为十进制、整数转换成二进制、数字转换成16进制的各种方法,一一介绍如下:第一、十进制转为十六进制 DECLARE @binary varbinary(255)...
  • //第一个参数是要转十六进制十进制整数,第二个位显示的位数 private String getHexString(int value, int count) { String result = Integer.toHexString(value); int length = count - result....
  •  从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。  注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。 样例输入 FFFF 样例输出 65535 #include<...
  • 8位十六进制数字从text表示中的十六进制数字到数字类型没有强制转换,但我们可以bit(n)用作航点。位串中的4位编码1个十六进制数字。从位串到bit(32)最多(最多8个十六进制数字)到integer(标准4字节整数)有一个未记录...
  • 十六进制转换成十进制Data SEGMENT String DB 'input 4 hex num:',0ah,0dh,'$' Num DB 10 DUP(?) Data ENDS Code SEGMENT ASSUME CS:code,DS:data Start: MOV AX,daTA MOV DS,AX LEA DX,string MOV AH ,9 INT 21h ...
  • 在使用串口进行数据传输时,int型数据一般通过两部分上传,在串口助手中接收到的数据十六进制,要把这些数据还原要合并并转换为十进制,此文档说明了用excel将两列的十六进制数转为一列十进制数的方法
  • /*** 字符串转换成十六进制字符串* @param String str 待转换的ASCII字符串* @return String 每个Byte之间空格分隔,如: [61 6C 6B]*/public staticString str2HexStr(String str){char[] chars = "0123456789ABCDEF...
  • 在数字电子技术中,特别是PLC中,经常用到2,8,10,16进制。下表是关于2,8,10,16进制的三要素,如图所示:本来,N进制...例如:1101是二进制、八进制、十进制还是十六进制数呢?为了明确区分,我们就在数的前...
  • void convent(unsigned short a) { unsigned int c,d[32]={0}; int i=0; while(a!=0) { c=a%2;//取最小权的位 d[i]=c; a=a/2; ...//逆序输出,否则输出的二进制数是逆序的 ...
  • 辗转求余法实现的任意长度十进制数到2进制和16进制转换方法
  • 十进制转为十六进制

    2014-03-06 17:20:59
     十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号,分别表示十进制数的0至15。十六进制的计数方法是满16进1,所以十进制数16在十六进制中是10,而十...
  • }else { System.out.println("请输入正确的十六进制数"); } } } } 注意: 1,如何控制十六进制的输入:用正则表达式str.matches("[0-9a-fA-F]*") 2,借用java已经封装好的方法转化十六进制:...
  • void int2other( int number, int size, int mask, int shift ) // size 为字符位数,mask 为低位掩码,shift 为右移位 { char* result = new char[size]; int i = 0; int idx; while ( number ) { ...
  • // 本文介绍的主要是java十进制数字类型转十六进制,由于十进制超出范围的问题。将超出范围的的数字转换为Long类型  ,然后进行计算,同样可得到结果 package com.java.test; public class JinZhi{  ...
  • 从键盘输入十进制数,将其转为十六进制(用反转字符串方法) import java.util.Scanner; public class DecToHex{ public static void main(String[] args){ Scanner input=new Scanner(System.in); int n=...
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼'在编辑框"ten"(需要设置输入方式"输入数字")中输入10进制数字,编辑框"sixteen"中输出16进制数字过程 十六()变量 寄存ten 为 整数型sixteen.内容 =""如果 ten.内容 &...

空空如也

空空如也

1 2 3 4 5 ... 19
收藏数 365
精华内容 146
关键字:

十进制数转为十六进制数