為什麼這篇strtol 16進位鄉民發文收入到精華區:因為在strtol 16進位這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者ccbruce (今、そこに いる僕)看板C_and_CPP標題[心得] 十六進位字串轉成整數時...
這個問題大概被討論到爛掉了, 用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