QAQ……#define INF 0x3f3f3f3f 原來是定義成無窮大

經常在參觀大佬的博客的時候看到這種寫法,百思不得其解, “0x3f3f3f3f ”什麼/*雖然,似乎,好像剛剛看過進制轉換……就當我選擇性失憶吧*/

-------------------

0x3f3f3f3f的十進制是1061109567,也就是10^9級別的(和0x7fffffff(32-bit int的最大值)一個數量級),而一般場合下的數據都是小於10^9的,所以它可以作爲無窮大使用而不致出現數據大於無窮大的情形。

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


最大好處:
     如果我們想要將某個數組清零,我們通常會使用memset(a,0,sizeof(a)),但是當我們想將某個數組全部賦值爲無窮大時(例如解決圖論問題時鄰接矩陣的初始化),就不能使用memset函數了,因爲memset是按字節操作的,它能夠對數組清零是因爲0的每個字節都是0,現在好了,如果我們將無窮大設爲0x3f3f3f3f,那麼奇蹟就發生了,0x3f3f3f3f的每個字節都是0x3f!
     所以要把一段整型數組全部置爲無窮大,我們只需要 memset(a,INF,sizeof(a))

--------------------------------------分割線以上參見http://blog.csdn.net/wyg1997/article/details/53470460
下面內容來自於:http://www.knowsky.com/1041186.html
主要介紹優點
編程中無窮大的設定

很多人可能設爲0x7fffffff,這個數的確是32-bit int的最大值,符號位爲0,其他的都是1

但在很多情況下,0x7fffffff會出現錯誤,比如溢出,這樣兩個無窮大數相加會變成負數,還有如在做dijkstra求最短路時,當做鬆弛操作,判斷if (d[u]+w[u][v]<d[v]) d[v]=d[u]+w[u][v]時,若u到v沒有路勁,w[u][v]=0x7fffffff,這樣d[u]+w[u][v]會變成負數,這就產生了錯誤。

爲了儘量避免以上的錯誤,我們可以改變無窮大的設定,可以將0x3f3f3f3f設爲無窮大,0x3f3f3f3f的10進製表示爲1061109567,這個數已達到10^9,足以表示無窮大,又0x3f3f3f3f+0x3f3f3f3f=2122219134,滿足無窮大+無窮大仍爲無窮大

當把無窮大設爲0x3f3f3f3f時,在做初始化時也很方便,比如在初始化數組a時,可以使用

Memset(a,0x3f,sizeof(a)),因爲0x3f3f3f3f的每個字節都是0x3f,如果使用0x7fffffff,需要循環賦值,耗費更多時間

----------------------------------------------------------------------------------------------------------------------

先放段代碼,然後有時間一個一個寫

#define lson 2*i    
#define rson 2*i+1    
#define LS l,mid,lson    
#define RS mid+1,r,rson    
#define UP(i,x,y) for(i=x;i<=y;i++)    
#define DOWN(i,x,y) for(i=x;i>=y;i--)    
#define MEM(a,x) memset(a,x,sizeof(a))    
#define W(a) while(a)    
#define gcd(a,b) __gcd(a,b)    
#define LL long long    
#define N 1000005    
#define MOD 1000000007    
#define INF 0x3f3f3f3f    
#define EXP 1e-8    
#define lowbit(x) (x&-x)  

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