c++中的位运算与逻辑运算

正好做状压dp就收集了点c++中位运算与逻辑运算的技巧

参考博客:http://blog.csdn.net/zouliping123/article/details/8995373

                  http://blog.csdn.net/y990041769/article/details/12977271

左移运算:x << y。将x左移y位,将x最左边的y位丢弃,在右边补y个0。

右移运算:x >> y。将x右移y位,这需要区分x是有符号数还是无符号数。在x是无符号数时,只需将x的最右边的y位丢弃,在左边补上y个0。在x是有符号数时,又分为x是正数还是负数。正数时,同无符号数的处理相同;负数时,将将x的最右边的y位丢弃,在左边补上y个1。


位运算技巧

计算一个数的二进制中1的个数

通过与初始值为1的标志位进行与运算,判断最低位是否为1;然后将标志位左移,判断次低位是否为1;一直这样计算,直到将每一位都判断完毕。

[cpp]   view plain copy
  1. /* 
  2.     计算一个数的二进制中1的个数 
  3. */  
  4. int countOf1(int num)  
  5. {  
  6.     int count = 0;  
  7.     unsigned int flag = 1;  
  8.   
  9.     while(flag)  
  10.     {  
  11.         if(num & flag)  
  12.         {  
  13.             count++;  
  14.         }  
  15.   
  16.         flag = flag << 1;  
  17.     }  
  18.     return count;  
  19. }  

还有一种方法,一个整数减一,可以得到该整数的最右边的1变为0,这个1右边的0变为1。对这个整数和整数减一进行与运算,将该整数的最右边的1变为0,其余位保持不变。直到该整数变为0,进行的与运算的次数即为整数中1的个数。

[cpp]   view plain copy
  1. /* 
  2.     计算一个数的二进制中1的个数 
  3. */  
  4. int countOf1_2(int num)  
  5. {  
  6.     int count = 0;  
  7.   
  8.     while(num)  
  9.     {  
  10.         num = num & (num - 1);  
  11.         count++;  
  12.     }  
  13.     return count;  
  14. }  

判断一个数是否是2的n次方

一个数是2的n次方,则这个数的最高位是1,其余位为0。根据上一题的第二种解法可以很容易得到解决方案。将这个整数与整数减一进行与运算,如果得到的结果为零,可证明该数为2的n次方。

[cpp]   view plain copy
  1. /* 
  2.     判断一个数是否为2的n次方(一个数为2的n次方,则最高位为1,其余位为0) 
  3. */  
  4. bool is2Power(int num)  
  5. {  
  6.     bool flag = true;  
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值