zoukankan      html  css  js  c++  java
  • 十六进制转十进制

        我们经常碰到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
    ", htoi(argv[1]));
        printf("M/Byte: %ld
    ", 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学堂南郁


  • 相关阅读:
    HDU4366 Successor 线段树+预处理
    POJ2823 Sliding Window 单调队列
    HDU寻找最大值 递推求连续区间
    UVA846 Steps 二分查找
    HDU3415 Max Sum of MaxKsubsequence 单调队列
    HDU时间挑战 树状数组
    UVA10168 Summation of Four Primes 哥德巴赫猜想
    UESTC我要长高 DP优化
    HDUChess 递推
    HDU4362 Dragon Ball DP+优化
  • 原文地址:https://www.cnblogs.com/fuhaots2009/p/3483557.html
Copyright © 2011-2022 走看看