第11关|位运算常用技巧

1s代表与x等长的1串,0s代表与x等长的0串

x ^ 1s = x  ,x ^ 0s = ~x,x ^ x = 0

x & 1s = x  ,x & x = x

与1与还是它本身,与0或还是它本身。

1、获取

获取i位是1还是0。返回值为1就是1,返回值为0就是0。

将1左移i位,会得到第i位为1,其余位都为0的数,形如:000001000。此时与要判断的数相与就可以单独判断i位。

boolean getBit(int num,int i){
    return ((num&(1<<i))!=0);
}

2、设置

将某一位设为1。

将1左移i位,与num进行或运算后,不影响其他位,将i位数据设为1。

int setBit(int num,int i){
    return num |(1<<i);
}

3、清零

将某一位设为0。

将1左移i位,并取反后,得到形如111101111的数(i位为0)。与num进行相与运算,不影响其他位,将i位数据设为0。

int clearBit(int num ,int i){
    int mask=~(1<<i);
    return num&mask;
}

4、更新

更新第i位。

将清零操作和设置操作结合。先将i位清0,然后跟据传入的v确定更新为0还是1。

v是0则是0,v是1则是1。

int updateBit(int num,int i,int v){ 
    int mask=~(1<<i); 
    return (num&mask)|(v<<i);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值