十六进制转十进制 - 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 ...
随机推荐
- HDU 5312 Sequence (规律题)
题意: 一个序列的第n项为3*n*(n-1)+1,而 n>=1,现在给一个正整数m,问其最少由多少个序列中的数组成? 思路: 首先,序列第1项是1,所以任何数都能构成了.但是最少应该是多少?对式 ...
- 【C#学习笔记】LinkedList容器使用
using System; using System.Collections.Generic; namespace ConsoleApplication { class Program { stati ...
- ffmpeg基础与编译_在VS2008下调试output_example.c(详细步骤)
注意:这个是编译Debug版本的.必要资源:FFMPEG SDK 3.2(已经编译好的,可以去http://www.bairuitech.com/html/ruanjianxiazai/ffmpeg/ ...
- ios第三方开源库
1.AFNetworking 目前比较推荐的iOS网络请求组件,默认网络请求是异步,通过block回调的方式对返回数据进行处理. 2.FMDB 对sqlite数据库操作进行了封装,demo也比较简单. ...
- CKEditor如何统计文字数量
今天在修改v5后台的比赛系统时,发现文本框需要限制输入字数.我们这个系统用的是3.6.3版本的,前台代码是这样的 <script> //编辑器 CKEDITOR.replace('matc ...
- MSSQL 2005数据库与SP4补丁安装
Sql Server 2005 正确安装之前的win7配置: http://wenku.baidu.com/link?url=6T3jzVnu2XY_sfqfe9ZqQ_6dUOdrZwHc83baW ...
- C# C/S 结构操作Ini系统文件
Winfrom 开发时,有时会将一些系统某个设置保存到Ini 类型的文件中.下面提供操作Ini 文件的代码: public static class IniFiles { [DllImport(&qu ...
- C# 如何以参数的形式调用.exe程序
System.Diagnostics.Process.Start("程序的路径", "参数1 参数2");第一个参数是aaa.exe 的路径,第二个参数是用空格 ...
- [Everyday Mathematics]20150123
设 $A,B$ 是同阶方阵, 满足 $\rank(AB-BA)=1$. 试证: $(AB-BA)^2=0$.
- XTUOJ1250 Super Fast Fourier Transform 暴力
分析:因为加起来不超过1e6,所以最多有1000+个不同的数 做法:离散化搞就好了 #include <cstdio> #include <iostream> #include ...