提高算法性能——位運算

轉自:編程論壇 http://bbs.bccn.net/thread-252089-1-2.html

這篇文章很強大,雖然c#不推薦用指針,還是很爽的

之後還有一篇matrix67大大的文章,更加強大

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

前面的基數排序一帖中,有幾處語句用到了位運算,不大好理解。查了很多資料,又經過sunkaidong版主的講解
總算弄明白了...現將查的資料總結一下,希望對大家有幫助。
1.判斷一個整數是不是2的冪
十進制       二進制 
2^0 == 1 0000 0001 
2^1 == 2 0000 0010 
2^2 == 4 0000 0100 
2^3 == 8 0000 1000 
2^4 == 16 0001 0000 
2^5 == 32 0010 0000 
從上述規律中我們可以得出,題目最終歸結爲判斷此數的二進制表示中是否只有一位爲1

1 bool IsPowerTwo(int x) 
2 
3   return ((x&(x-1))==0)&&x; 
4 

2.不用臨時變量,交換兩個整數 
 1 /***證明:
 2   b=(a^b)^b=a^(b^b)=a^0=a;
 3   a=(a^b)^((a^b)^b)=(a^b)^a=a^(a^b)=(a^a)^b=0^b=b;
 4 *********************/
 5 void Swap(int& a,int& b) 
 6 
 7   a ^= b; 
 8   b ^= a; 
 9   a ^= b; 
10 

3.計算絕對值 
 1 /**
 2 x>0,y=x>>31==0,(x^y)-y==x
 3 x<0,y=x>>31==0xffffffff,(x^y)-y爲x變反後加1,即爲絕對值
 4 */
 5 int Abs(int x) 
 6 //計算整型絕對值 
 7   int y ; 
 8   y = x >> 31 ; 
 9   return (x^y)-y ; //或(x+y)^y 
10 }
11 /**
12 x>0,符號位0,與0後不變,
13 x<0,符號位1,與0後變反
14 */
15 double Abs(double x)
16 {//計算浮點型絕對值
17   double y = x;
18   *(((int *)&y)+1)&=0x7fffffff;
19   return y;
20 }

4.不用判斷語句,求兩整數的最大最小值
 1 /****
 2 道理和計算整型絕對值相似
 3 */
 4 int Min(int a, int b) 
 5 
 6   int diff = b - a; 
 7   return a + (diff & (diff >> 31)); 
 8 
 9 int Max(int a, int b) 
10 
11   int diff = b - a; 
12   return b - (diff & (diff >> 31)); 
13 

位運算往往能縮短代碼長度,提高算法性能,但也會讓代碼變得難以理解,建議合理利用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章