看板 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
stupid0319:用while(*ptr) ,會不會比較容易看的懂 10/27 18:00
loveme00835:是喔...我都用巨集耶, 好幾行也不會差到哪去 10/27 18:35
tomap41017:推!!但需要花點時間理解!!小弟太嫩了...... 10/28 00:51