位运算可以实现哪些功能

位运算可以实现哪些功能

    

     许多时候,我们为了减少算法的时间复杂度,都是推荐使用位运算,今天我们整理一下位运算可以实现哪些功能。


1. 乘除2


    左移1位乘以2,左移n位乘以2^n;

    右移1位除以2,右移n位除以2^n;


    举个例子:

[cpp]  view plain  copy
  1. #include<iostream>  
  2. using namespace std;   
  3.   
  4. int main()  
  5. {  
  6.     int a = 16;   
  7.     int b = 25;   
  8.   
  9.     //乘除2  
  10.     cout<<(b<<1)<<' '<<(a>>1)<<endl;   
  11.   
  12.     return 0;   
  13. }  


2. 判断奇偶数


    用到位运算中的按位与,和1按位与。

    如下:


[cpp]  view plain  copy
  1. #include<iostream>  
  2. using namespace std;   
  3.   
  4. int main()  
  5. {  
  6.     int a = 16;   
  7.     int b = 25;   
  8.   
  9.     // 判断奇偶数  
  10.     if(a & 1)  
  11.         cout<<"Odd"<<endl;   
  12.     else  
  13.         cout<<"Even"<<endl;   
  14.   
  15.     return 0;   
  16. }  


3. 取余运算


    还是使用按位与运算符,只不过不再是和1按位与了。

[cpp]  view plain  copy
  1. #include<iostream>  
  2. using namespace std;   
  3.   
  4. int main()  
  5. {  
  6.     int a = 16;   
  7.     int b = 25;   
  8.   
  9.     // 取余  
  10.     cout<<(a & 3)<<endl;  // 除以4的余数  
  11.     cout<<(a & 7)<<endl;  // 除以8的余数  
  12.     cout<<(a & 8)<<endl;  // 无效,只能运算2的次幂的余数  
  13.   
  14.     return 0;   
  15. }  

分析:注意这个方法只能计算2的次幂的余数,而且参加按位与的只能是2^n-1,因为这些数的二进制形式全是1.


4. 求相反数

    使用按位取反运算符。

[cpp]  view plain  copy
  1. //求相反数  
  2. cout<<(~a+1)<<endl;   


5. 求绝对值

  使用异或运算符(^)

[cpp]  view plain  copy
  1. #include<iostream>  
  2. using namespace std;   
  3.   
  4. int main()  
  5. {  
  6.     int a = -36;   
  7.     int b = 25;   
  8.   
  9.     // 绝对值  
  10.     int tmp = a>>31;  // /a大于等于0时tmp为0,a小于0时tmp为-1    
  11.     int A = (a^tmp)-tmp;   
  12.     cout<<A<<endl;   
  13.   
  14.     return 0;   
  15. }  


    这些基本的数学运算都是可以通过为运算符来实现,时间复杂度都比较低,以后常用。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值