INF設定為0x3f3f3f3f的部分原因

2021-09-23 20:31:31 字數 1234 閱讀 4775

在演算法競賽中,我們常常需要用到乙個「無窮大」的值,對於我來說,大多數時間我會根據具體問題取乙個99999999之類的數(顯得很不專業啊!)

在網上看別人**的時候,經常會看到他們把inf設為0x7fffffff,奇怪為什麼設乙個這麼奇怪的十六進製制數,一查才知道,因為這是32-bit int的最大值。如果這個無窮大只用於一般的比較(比如求最小值時min變數的初值),那麼0x7fffffff確實是乙個完美的選擇。

if

(d[u]

+w[u]

[v]) d[v]

=d[u]

+w[u]

[v];

如果u,v之間沒有邊,那麼w[u][v]=inf,如果我們的inf取0x7fffffff,那麼d[u]+w[u][v]會溢位而變成負數,我們的鬆弛操作便出錯了!

準確來說,0x7fffffff不能滿足「無窮大加乙個有窮的數依然是無窮大」這個條件,它會變成了乙個很小的負數。

更進一步的,如果有乙個數能夠滿足「無窮大加無窮大依然是無窮大」,那麼就更好了!

前陣子無意中看到了乙個不一樣的取值,inf=0x3f3f3f3f,這時我又鬱悶了,這個值又代表的是什麼?於是我去尋找答案,發現這個值的設定真的很精妙!

0x3f3f3f3f的十進位制是1061109567,是109級別的(和0x7fffffff乙個數量級),而一般場合下的資料都是小於10^9的,所以它可以作為無窮大使用而不致出現資料大於無窮大的情形。

另一方面,由於一般的資料都不會大於10^9,所以當我們把無窮大加上乙個資料時,它並不會溢位(這就滿足了「無窮大加乙個有窮的數依然是無窮大」),事實上0x3f3f3f3f+0x3f3f3f3f=2122219134,這非常大但卻沒有超過32-bit int的表示範圍,所以0x3f3f3f3f還滿足了我們「無窮大加無窮大還是無窮大」的需求。

最後,0x3f3f3f3f還能給我們帶來乙個意想不到的額外好處:

如果我們想要將某個陣列清零,我們通常會使用memset(a,0,sizeof(a)),方便又高效,但是當我們想將某個陣列全部賦值為無窮大時,就不能使用memset函式而得自己寫迴圈了,因為memset是按位元組操作的,它能夠對陣列清零是因為0的每個位元組都是0(一般我們只有賦值為-1和0的時候才使用它)。現在好了,如果我們將無窮大設為0x3f3f3f3f,那麼奇蹟就發生了,0x3f3f3f3f的每個位元組都是0x3f!所以要把一段記憶體全部置為無窮大,我們只需要memset(a,0x3f,sizeof(a))。

所以在通常的場合下,0x3f3f3f3f真的是乙個非常棒的選擇!

為何INF設定為0x3f3f3f3f?

在演算法競賽中,我們常常需要用到乙個 無窮大 的值,對於我來說,大多數時間我會根據具體問題取乙個99999999之類的數 顯得很不專業啊!在網上看別人 的時候,經常會看到他們把inf設為0x7fffffff,奇怪為什麼設乙個這麼奇怪的十六進製制數,一查才知道,因為這是32 bit int的最大值。如...

關於0x3f3f3f3f 0x四個3f

今天正好看到一篇相關的部落格,故細細分析一下。引用自 如果問題中各資料的範圍明確,那麼無窮大的設定不是問題,在不明確的情況下,很多程式設計師都取0x7fffffff作為無窮大,因為這是32 bit int的最大值。如果這個無窮大只用於一般的比較 比如求最小值時min變數的初值 那麼0x7ffffff...

關於 0x3f3f3f3f 的問題

0x3f3f3f3f是乙個很有用的數值,它是滿足以下兩個條件的最大整數。1 整數的兩倍不超過 0x7f7f7f7f,即int能表示的最大正整數。2 整數的每8位 每個位元組 都是相同的。我們在程式設計中經常需要使用 memset a,val,sizeof a 初始化乙個陣列a,該語句把數值 val ...