十六进制转十进制 - 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 ...
随机推荐
- EF之MSSQL分布式部署一:EFContext自定义数据库链接
不废话,上代码: 来源:http://bbs.csdn.net/topics/390823046 原文地址:EF之MSSQL分布式部署一:EFContext自定义数据库链接 /// <sum ...
- HDU 1397 Goldbach's Conjecture【素数打表】
题意:给出n,问满足a+b=n且a,b都为素数的有多少对 将素数打表,再枚举 #include<iostream> #include<cstdio> #include<c ...
- codevs 1172 Hankson 的趣味题
woc....这题考细节处理.要注意代码的逻辑顺序还有不要作死地循环到sqrt+1. #include<iostream> #include<cstdio> #include& ...
- Java [leetcode 7] Reverse Integer
问题描述: Reverse digits of an integer. Example1: x = 123, return 321 Example2: x = -123, return -321 Ha ...
- ASP.NET MVC模型部分验证
在很多情况下,我们为了代码的复用可能会存在ViewModel共用的情形.比方说,web应用中常常会遇到的一个需求就是用户找回密码的功能.用户首先要验证通过验证邮箱(通常是用户名)来获取验证码,然后再进 ...
- eclipse的使用
类似于数据库系统的三层目录结构,一般而言IDE在逻辑上都有三层目录结构:工作空间(或解决方案) -> 工程 -> 文件. 当然,如果构建java project,那么目录结构是可以更深,因 ...
- 【转】有趣的Autolayout示例-Masonry实现
原文网址:http://tutuge.me/2015/05/23/autolayout-example-with-masonry/ 好久没有写Blog了,这段时间有点忙啊=.=本文举了3个比较有“特点 ...
- Oracle 课程六之hint
课程目标 完成本课程的学习后,您应该能够: •什么是oracle hint •Hint的使用范围 •Hint 汇总 •演示常用的hint Hint简介 Hint是oracle 提供的一种SQL语法 ...
- [Everyday Mathematics]20150111
设 $n$ 阶方阵 $A=(\al_1,\cdots,\al_n)$ 非奇异, $B=(0,\al_2,\cdots,\al_n)$. 试证: $BA^{-1}$, $A^{-1}B$ 的秩均为 $n ...
- 【Android】如何使用安卓的logcat『整理』
logcat是Android中一个命令行工具,可以用于得到程序的log信息.开发调试和测试定位bug都挺有用哒 有两种方式可以达到查看log的目的. 一 Eclipse集成DDMS插件 1 安装ecl ...