• 十六进制转十进制


        我们经常碰到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学堂南郁


  • 相关阅读:
    IOS开发之----协议与委托(Protocol and Delegate) 实例解析
    iOS开发-Protocol协议及委托代理(Delegate)传值
    android内置存储器memory和第三方外部存储disk管理
    余弦信号DFT频谱分析(继续)
    3.1存储管理操作系统
    android变化HOLO对话风格
    Coco2d-x android win7 Python 游戏开发环境的搭建
    ITIL该研究的结论(互联网思维的结合)
    亚马逊记AWS(Amazon Web Services)自由EC2应用
    oracle触发农产品证明文件号码
  • 原文地址:https://www.cnblogs.com/fuhaots2009/p/3483557.html
Copyright © 2020-2023  润新知