十六进制转十进制 - C
我们经常碰到16进制数转10进制的情况,使用下面的C程序即可完成上述工作。
那么他是怎样的工作原理呢?
6.2.5 十六进制数转换成十进制数
16进制就是逢16进1,但我们只有0~9这十个数字,所以我们用A,B,C,D,E,F这五个字母来分别表示 10,11,12,13,14,15。字母不区分大小写。
十六进制数的第0位的权值为16的0次方,第1位的权值为16的1次方,第2位的权值为16的2次方……
所以,在第N(N从0开始)位上,如果是是数 X (X 大于等于0,并且X小于等于 15,即:F)表示的大小为 X * 16的N次方。
假设有一个十六进数 2AF5, 那么如何换算成10进制呢?
用竖式计算:
2AF5换算成10进制:
第0位: 5 * 16
0
= 5
第1位: F * 16
1
= 240
第2位: A * 16
2
= 2560
第3位: 2 * 16
3
= 8192 +
-------------------------------------
10997
直接计算就是:
(5 * 16
0
) + (F * 16
1
) + (A * 16
2
) + (2 * 16
3
)= 10997
(别忘了,在上面的计算中,A表示10,而F表示15)
注*
以此,程序的需要两部分组成:
1. 权值计算
16的几次方,power(16, x)
unsigned long power(int a, int b)
{
int i;
unsigned long result = 1;
for(i = 0; i < b; i++)
{
result *= a;
} return result;
};
2. 单16进制值转10进制值
例如:如果是F,则表示15
switch (ch)
{
case '0':
iCh = 0;
break;
case '1':
iCh = 1;
break;
case '2':
iCh = 2;
break;
case '3':
iCh = 3;
break;
case '4':
iCh = 4;
break;
case '5':
iCh = 5;
break;
case '6':
iCh = 6;
break;
case '7':
iCh = 7;
break;
case '8':
iCh = 8;
break;
case '9':
iCh = 9;
break;
case 'a':
iCh = 10;
break;
case 'b':
iCh = 11;
break;
case 'c':
iCh = 12;
break;
case 'd':
iCh = 13;
break;
case 'e':
iCh = 14;
break;
case 'f':
iCh = 15;
break; default:
iCh = -1;
break;
}
为了满足,把所有输入转换为小写字母,可以使用系统函数tolower()或者我们自己写的函数toLower()
int toLower(int c)
{
if(c >= 'A' && c <= 'Z')
{
return c + 'a' - 'A';
} else {
return c;
}
};
完整程序如下:
/*
* hex2int.c
*
* Created on: 2010-07-20
* Author: xiaobin
*
*/ #include <stdio.h>
/* #include <math.h> */
#include <string.h>
//#include <ctype.h> /* int max is 32767 */
/* "%d" only print int */
/* long max is 2147483647 */
/* "%ld" can print long type */
/* unsigned long max is 4294967295 */
/* "%lu" can print unsigned long type */ #define MB 0x0100000UL unsigned long power(int a, int b);
int toLower(int c);
unsigned long htoi(char s[]); int main(int argc, char* argv[])
{
if(argc > 1)
printf("long integer: %lu\n", htoi(argv[1]));
printf("M/Byte: %ld\n", MB);
return 0;
} unsigned long htoi(char *s)
{
int i, len;
unsigned long value, result;
int iCh;
unsigned long iPow;
int pos;
char ch; result = 0;
len = 0;
value = 0;
iCh = -1; len = strlen(s);
pos = 0; len -= 1; for(i = len; (s[i] >= '0' && s[i] <= '9')
|| (s[i] >= 'a' && s[i] <= 'f')
|| (s[i] >= 'A' && s[i] <= 'F'); i--) { ch = toLower(s[i]); /* tolower() defined in ctype.h */ switch (ch) {
case '0':
iCh = 0;
break;
case '1':
iCh = 1;
break;
case '2':
iCh = 2;
break;
case '3':
iCh = 3;
break;
case '4':
iCh = 4;
break;
case '5':
iCh = 5;
break;
case '6':
iCh = 6;
break;
case '7':
iCh = 7;
break;
case '8':
iCh = 8;
break;
case '9':
iCh = 9;
break;
case 'a':
iCh = 10;
break;
case 'b':
iCh = 11;
break;
case 'c':
iCh = 12;
break;
case 'd':
iCh = 13;
break;
case 'e':
iCh = 14;
break;
case 'f':
iCh = 15;
break; default:
iCh = -1;
break;
} iPow = power(16, pos);
pos++; value = iPow * iCh; result += value;
} return result;
}; unsigned long power(int a, int b)
{
int i;
unsigned long result = 1;
for(i = 0; i < b; i++)
result *= a; return result;
}; int toLower(int c)
{
if(c >= 'A' && c <= 'Z')
return c + 'a' - 'A';
else
return c;
};
在CDT编译通过。
如有疑问请参考:《使用CDT+cygwin编写C/C++》
注*: 参考文章《第六章 二进制、八进制、十六进制》 - 第2学堂南郁
十六进制转十进制 - C的更多相关文章
- [No000071]C# 进制转换(二进制、十六进制、十进制互转)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 十六进制转十进制函数_C编程
/**************************十六进制转十进制函数**************************//*函数原型:uint htd(uint a)/*函数功能:十六进制转十 ...
- UTC格式转换 & 十六进制换算为十进制
UTC格式转换成北京时间格式: /// <summary> /// UTC格式与datatime的转换 /// </summary> /// <param name=&q ...
- BCD码、十六进制与十进制互转
在做嵌入式软件的设计中,常常会遇到十六进制.BCD码与十进制之间的转换,近期做M1卡的应用中,涉及了大量的十六进制.BCD码与十进制之间的转换.通过对BCD码.十六进制 权的理解,轻松的实现了他们之间 ...
- C语言的本质(2)——二进制、八进制、十六进制与十进制
二进制是计算技术中广泛采用的一种数制.二进制数据是用0和1两个数码来表示的数.它的基数为2,进位规则是"逢二进一",借位规则是"借一当二",由18世纪德国数理哲 ...
- C# 进制转换(二进制、十六进制、十进制互转)
原文地址:https://www.cnblogs.com/icebutterfly/p/8884023.html C# 进制转换(二进制.十六进制.十进制互转)由于二进制数在C#中无法直接表示,所以所 ...
- 八进制、十六进制与十进制的转换,bytes的十六进制
二进制.八进制.十六进制与十进制的不同顾名思义在于进位不同: 十进制遇十进一,9+1=10,19+1=20,199+1=200.相同数字前一位是后一位的十倍,例如11,前一个代表10,后一个是1. 一 ...
- lqb 基础练习 十六进制转十进制
基础练习 十六进制转十进制 时间限制:1.0s 内存限制:512.0MB 问题描述 从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出. 注:十六进制数中的10~ ...
- JAVA 十六进制和十进制、二进制转换
java十六进制和十进制.二进制转换 十进制转化成十六进制 Integer x = 100; hex = x.toHexString(x); 十六进制转化成十进制 Integer.parseInt(h ...
- python实现进制转换(二、八、十六进制;十进制)
python实现进制转换(二.八.十六进制:十进制) (一)十进制整数转为二.八.十六进制 1.format实现转换>>> format(2,"b") # (10 ...
随机推荐
- UVa 10969 (圆与圆之间的覆盖问题) Sweet Dream
题意: 有n个按先后顺序放置的不同大小不同位置的圆,求所有可见圆弧的长度. 分析: 这道题应该是大白书上例题 LA 2572 (求可见圆盘的数量) Kanazawa 的加强版,整体框架都差不多. 对于 ...
- BZOJ_1025_[SHOI2009]_游戏_(素数表+最小公倍数+DP)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1025 分析 对于\(n\),转一圈回来之后其实是好几个环各转了整数圈.这些环中的数为\(1,2 ...
- 微信分享自定义图片标题摘要-微信官方API
我们平时在使用微信内置浏览器打开网页想要分享给好友或者发到朋友圈的时候经常会遇到这样的问题, 别人的网页分享的时候是这样的: 而我们自己的网页分享后这这样的: 看到有人说不做任何设置,微信分享时会自动 ...
- RTP/RTCP(一)-H264关于RTP协议的实现
H264关于RTP协议的实现2010-07-22 13:35完整的C/S架构的基于RTP/RTCP的H.264视频传输方案.此方案中,在服务器端和客户端分别进行了功能模块设计.服务器端:RTP封装模块 ...
- 最简单的视音频播放示例2:GDI播放YUV, RGB
前一篇文章对“Simplest Media Play”工程作了概括性介绍.后续几篇文章打算详细介绍每个子工程中的几种技术.在记录Direct3D,OpenGL这两种相对复杂的技术之前,打算先记录一种和 ...
- 【ASP.NET MVC】"[A]System.Web.WebPages.Razor.Configuration.HostSection 无法强制转换为 ..."的解决办法
1.错误页面: “/”应用程序中的服务器错误. [A]System.Web.WebPages.Razor.Configuration.HostSection 无法强制转换为 [B]System.Web ...
- 一天一个Java基础——数组
一天一个变成了几天一个,最近接受的新东西太多.太快,有好多需要blog的但没有时间,这些基础知识应该是要深挖并好好研究的,不应该每次都草草了事,只看个皮毛. 数组: JVM将数组存储在一个称为堆(he ...
- 【字符串处理】HDOJ-1020-Encoding
[题目链接:HDOJ-1020] 相邻字符,两两比较. #include<cstdio> #include<cstring> ; char sr[MAXN]; int main ...
- MySQL基础之第6章 创建、修改和删除表 .
6.1.创建表 6.1.1.创建表的语法形式 CREATE TABLE 表名 ( 属性名 数据类型 [完整性约束条件],属性名 数据类型 [完整性约束条件],...... 属性名 数据类型); 完整性 ...
- 消息提示和消息推送插件toastr
http://www.jq22.com/yanshi476 比较棒的消息提示和消息推送插件toastr function myIntervalshow() { // showPopup1(300, 1 ...