位运算的常用技巧

位运算的常用技巧

功能示例式子
去掉最后一位10110->1011x>>1
在最后添加01011->10110x<<1
在最后添加11011->10111(x<<1)|1
右数第k位成为1100011->101011,k=4x|(1<<(k-1))
右数第k位成为0101011->100011,k=4x&~(1<<(k-1))
获取右数第k位101011->1,k=4(x>>(k-1))&1
截取最后的k位101011->1011,k=4x&((1<<k)-1)
把右边连续的1变成0101011->101000x&(x+1)
把右起第一个0变成1101011->101111x|(x+1)
把右起连续的0变成1101000->101111x|(x-1)
把右起的第一个1变成0101000->100000x&(x-1)
取右边连续的1101111->1111(x^(x+1))>>1

位运算的应用:

  1. 两数符号相同:

    //判断两个数的符号相同
    int x,y;
    bool f = ((x^y)<0);
    
  2. 判断一个数是不是2的幂次:

    //判断一个数是不是2的幂次
    int x;
    bool f=(x&(x-1))==0;
    
  3. 计算一个数的二进制有几个一:

    //计算一个数的二进制有几个一
    int x,c=0;
    for(;x;c++){
        x=x&(x-1);
    }
    
  4. 得到右数第一个1和后面的0构成的数:

    int x;
    //得到右数第一个1和后面的0构成的数
    int lowbit(x){return x-x&(x-1)};
    int lowbit(x){return x&(-x)}
    

集合枚举:

  1. 用于状态压缩是的集合枚举:
    1. 例如n=5,x=(11001)_2.
    2. 所有子集(原来为0的不变,1的位置可变可不变):
    3. 所有超集(原来1的位置不变,0的位置可变可不变):
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值