[心得] 十六進位字串轉成整數
這個問題大概被討論到爛掉了, 用strtol是最快的...但若是不用strtol呢? 怎麼作比較
有效率呢?
在不考慮字元的範圍的情況下, 我是這麼作的...
#include <stdio.h>
int main(int argc, char *argv[])
{
const char *s="2A3b";
unsigned int n=0;
for(const char *ptr=s;
*ptr;
n=(n<<4)+(((*ptr-'0')>>4)&0x1)*9+((*ptr++-'0')&0xf));
printf("%x\n", n);
return 0;
}
看出來了嗎?
1. 先求出每個字元與'0'的距離
2. 把距離除以16
3. 倍數是0的就是0-9, 倍數是1的就是大寫A-F, 倍數是3的就是小寫A-F
而且0-9這組的餘數就是結果, 而A-F這兩組就是餘數加上9
透過簡單的算式只要一行就可以很快的轉換。這是因為當初ASCII 在定義時就故意設定成
這樣, 也就是現在講的碼位。只要運用碼位就可以很快地查到想要的東西, 所以設計字集
時如何規劃碼位也很重要的。在現在相對強大的機器上多幾個if-else 雖然可以達到同樣
目的, 但在那時候很弱小的機器上, if-else 能少用就少用, 因為分岐指令很浪費時間,
而且還會阻礙管線的執行, 所以都是用這些招數盡量省掉的。
以下就是ASCII 的碼位區劃...
http://en.wikipedia.org/wiki/File:ASCII_Code_Chart-Quick_ref_card.png

--
裸になって
何が悪い?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 122.116.57.76
→
10/27 18:00, , 1F
10/27 18:00, 1F
→
10/27 18:35, , 2F
10/27 18:35, 2F
推
10/28 00:51, , 3F
10/28 00:51, 3F
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章