[心得] 十六進位字串轉成整數

看板C_and_CPP (C/C++)作者 (今、そこに いる僕)時間15年前 (2010/10/27 15:58), 編輯推噓1(102)
留言3則, 3人參與, 最新討論串1/1
這個問題大概被討論到爛掉了, 用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
用while(*ptr) ,會不會比較容易看的懂
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
文章代碼(AID): #1CnzkLmv (C_and_CPP)
文章代碼(AID): #1CnzkLmv (C_and_CPP)