用 0x3f3f3f3f 設定最大int值的優點

在許多算法中都要用到一個常量來表示最大值,例如:尋找一個最小數,就要先設定一個值a,如果比a小,a就等於這個數;再如,最短路徑中基本的鬆弛操作:

1
if (d[u]+w[u][v]<d[v]) d[v]=d[u]+w[u][v];
計算機不會表示出“無窮大”的概念,所以我們只能以一個定值來表示“最大”。那麼使用什麼值呢?

對於int類型,很自然地,我們想到用 0x7f ff ff ff 。這是32-bit的int類型所能表示的最大值。int類型在內存中的形式是,除了第一位表示正負,剩下的二進制位表示數據大小,將所有位設置爲1,就是int的最大值,這個值是 2^31-1=2147483647 ,是一個十位數。

20150402204748

這樣做對於上文中的第一個例子,是沒有問題的,因爲不涉及到計算。但是如果對於後一種,就會出現數據溢出的隱患。如果這個最大值加上任何一個數,就會變成一個很小的負數。所以,我們還要滿足“無窮大加上無窮大還是無窮大。”的原則。

如果使用 0x3f3f3f3f ,這個問題可以得到完美的解決。這個數字的值是 1061109567,也是一個十位數,和 0x7fffffff是一個數量級的。而且它的兩倍是 2122219134 ,就滿足了即使兩個無窮大相加,仍然可以表示一個無窮大。

20150402205123

使用這個數還有一個好處。我們想將一個數組的數據全部置爲無窮大的時候(經常用到),使用的 memset的第二個參數value是8-bit的。

value:Value to be set. The value is passed as an int, but the function fills the block of memory using the unsigned charconversion of this value.

也就是說,memset是按照8位來格式化數組的,而通過上圖我們可以發現,0x3f3f3f3f的四個八位都是一樣的!這樣我們就可以使用memset來將數組所有值最大化,而不用使用循環了,提高了效率。

綜上,將INF(最大值)設置爲0x3f3f3f3f是一個不錯的選擇!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章