提高算法性能——位运算

转自:编程论坛 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 

位运算往往能缩短代码长度,提高算法性能,但也会让代码变得难以理解,建议合理利用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值