十六进制转十进制 - 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编译通过。

十六进制转十进制 - C

  如有疑问请参考:《使用CDT+cygwin编写C/C++

   

注*: 参考文章《第六章 二进制、八进制、十六进制》 - 第2学堂南郁


 

你可能感兴趣的:(十六进制)