0123456789ABCDEF”[0]

來源:互聯網
上載者:User

最後一個運算式”0123456789ABCDEF”[0]是一個常用的技巧,它可以快速將一個數字轉換為16進位字元。”0123456789ABCDEF”是一個字串字面量,類型是char[17](在C中)或者const char[17](在C++中),轉換後的指標類型分別為char*和const char*,因此”0123456789ABCDEF”[0]就是第0個元素’0’。這個技巧常常用在進位轉換中,以下代碼將一個長整數的記憶體映像轉換為16進位表示:

 

char* convert( unsigned long Value )

{

       static char Buffer[sizeof( unsigned long ) * 2 + 1];

       int i;

       for( i = sizeof( unsigned long ) * 2 - 1; i >= 0; --i )

       {

              Buffer[i] = "0123456789ABCDEF"[Value % 16];

              Value /= 16;

       }

       return Buffer;

}

 

當然,筆者在這裡介紹這些古怪的運算式僅僅為了對下標運算子進行一些探討,並非鼓勵人們編寫這樣的代碼。但在某些情況下,形如"0123456789ABCDEF"[Value%16]這樣的運算式仍然是一個很好的選擇,與下面的代碼相比:

 

Remainder = Value % 16;

if( Remainder >= 10 ) Buffer[i] = 'A' + Remainder - 10;

else Buffer[i] = '0' + Remainder;

 

前者顯然更加簡明、精練,更容易閱讀,所以,應根據不同的情況進行取捨。代碼中使用了除法和求餘運算,有些人很喜歡把這些運算直接用移位代替,以追求極速。但現代編譯器對代碼的最佳化已經非常出色,乘除運算與直接移位之間的效率差別已經小到幾乎可以忽略不計的程度,除非在需要進行大量數學運算或對效率極其敏感的場合,否則所提高的那麼一點微末的速度是無法彌補可讀性的損失的。在可讀性、空間及效率之間應進行均衡的選擇,而不是盲目追求極端。

 

本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/supermegaboy/archive/2009/11/23/4855000.aspx

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.