日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

十六进制转十进制

發布時間:2023/12/29 综合教程 26 生活家
生活随笔 收集整理的這篇文章主要介紹了 十六进制转十进制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我們經常碰到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學堂南郁

總結

以上是生活随笔為你收集整理的十六进制转十进制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。