您的位置:首页 > 其它

提高算法性能——位运算

2009-03-22 16:44 176 查看
转自:编程论坛 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

 bool IsPowerTwo(int x) 

 { 

   return ((x&(x-1))==0)&&x; 

 } 

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; 

 } 

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 

 }

 /**

 x>0,符号位0,与0后不变,

 x<0,符号位1,与0后变反

 */

 double Abs(double x)

 {//计算浮点型绝对值

   double y = x;

   *(((int *)&y)+1)&=0x7fffffff;

   return y;

 }

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) 

 { 

   int diff = b - a; 

   return b - (diff & (diff >> 31)); 

 } 

位运算往往能缩短代码长度,提高算法性能,但也会让代码变得难以理解,建议合理利用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: