设为首页 加入收藏

TOP

十六进制转十进制 - C
2014-11-23 21:12:40 来源: 作者: 【 】 浏览:13
Tags:十六进制 十进制

我们经常碰到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 * 160 = 5
第1位:  F * 161 = 240
第2位:  A * 162 = 2560
第3位:  2 * 163 = 8192  +
-------------------------------------
                 10997 
直接计算就是:
(5 * 160 ) + (F * 161 ) + (A * 162 ) + (2 * 163)= 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 
  
   
/* #include 
   
     */ #include 
    
      //#include 
     
       /* 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语言单向循环链表解决约瑟夫问题 下一篇山东理工大学ACM平台题答案关于C..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: