日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于0x3f3f3f3f(0x四个3f)

發布時間:2024/3/13 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于0x3f3f3f3f(0x四个3f) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在之前一道最小生成樹問題中遇到過,我按照以前的習慣把INF定義為10億,然后初始化數組為最大值,然后輸入連通的路+value,最后值仍然為INF的即為不通的。但是這里出問題了,INF定義為10億的話,最后顯示的數組的值是負的,最后改成0x3f3f3f3f終于解決了。

今天正好看到一篇相關的博客,故細細分析一下。

引用自:http://blog.csdn.net/bossup/article/details/9090277

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

如果問題中各數據的范圍明確,那么無窮大的設定不是問題,在不明確的情況下,很多程序員都取0x7fffffff作為無窮大,因為這是32-bit int的最大值。如果這個無窮大只用于一般的比較(比如求最小值時min變量的初值),那么0x7fffffff確實是一個完美的選擇,但是在更多的情況下,0x7fffffff并不是一個好的選擇。

  • 很多時候我們并不只是單純拿無窮大來作比較,而是會運算后再做比較,例如在大部分最短路徑算法中都會使用的松弛操作:
    if (d[u]+w[u][v]<d[v]) d[v]=d[u]+w[u][v];
    我們知道如果u,v之間沒有邊,那么w[u][v]=INF,如果我們的INF取0x7fffffff,那么d[u]+w[u][v]會溢出而變成負數,我們的松弛操作便出錯了,更一般的說,0x7fffffff不能滿足“無窮大加一個有窮的數依然是無窮大”,它變成了一個很小的負數。
  • 除了要滿足加上一個常數依然是無窮大之外,我們的常量還應該滿足“無窮大加無窮大依然是無窮大”,至少兩個無窮大相加不應該出現災難性的錯誤,這一點上0x7fffffff依然不能滿足我們。
  • 所以我們需要一個更好的家伙來頂替0x7fffffff,最嚴謹的辦法當然是對無窮大進行特別處理而不是找一個很大很大的常量來代替它(或者說模擬它),但是這樣會讓我們的編程過程變得很麻煩。在我讀過的代碼中,最精巧的無窮大常量取值是0x3f3f3f3f,我不知道是誰最先開始使用這個精妙的常量來做無窮大,不過我的確是從一位不認識的ACMer(ID:Staginner)的博客上學到的,他/她的很多代碼中都使用了這個常量,于是我自己也嘗試了一下,發現非常好用,而當我對這個常量做更深入的分析時,就發現它真的是非常精巧了。

  • 0x3f3f3f3f的十進制是1061109567,也就是10^9級別的(和0x7fffffff一個數量級),而一般場合下的數據都是小于10^9的,所以它可以作為無窮大使用而不致出現數據大于無窮大的情形。
  • 另一方面,由于一般的數據都不會大于10^9,所以當我們把無窮大加上一個數據時,它并不會溢出(這就滿足了“無窮大加一個有窮的數依然是無窮大”),事實上0x3f3f3f3f+0x3f3f3f3f=2122219134,這非常大但卻沒有超過32-bit int的表示范圍,所以0x3f3f3f3f還滿足了我們“無窮大加無窮大還是無窮大”的需求。
  • 最后,0x3f3f3f3f還能給我們帶來一個意想不到的額外好處:如果我們想要將某個數組清零,我們通常會使用memset(a,0,sizeof(a))這樣的代碼來實現(方便而高效),但是當我們想將某個數組全部賦值為無窮大時(例如解決圖論問題時鄰接矩陣的初始化),就不能使用memset函數而得自己寫循環了(寫這些不重要的代碼真的很痛苦),我們知道這是因為memset是按字節操作的,它能夠對數組清零是因為0的每個字節都是0,現在好了,如果我們將無窮大設為0x3f3f3f3f,那么奇跡就發生了,0x3f3f3f3f的每個字節都是0x3f!所以要把一段內存全部置為無窮大,我們只需要memset(a,0x3f,sizeof(a))。
  • 所以在通常的場合下,0x3f3f3f3f真的是一個非常棒的選擇。

    負無窮大用0xcfcfcfcf比較好。


    總結

    以上是生活随笔為你收集整理的关于0x3f3f3f3f(0x四个3f)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。