求一个数字的掩码的方法总结

转载自https://blog.csdn.net/yaoayao470/article/details/84874126


对于 00000101,它的掩码为 00000111

1 使用 Integer.highestOneBit(int num方法,如101调用这个方法,得到4(100)。然后左移一位,再减1 ,得到掩码(速度最慢)

int mask = (Integer.highestOneBit(num)<<1)-1;

2 把值为1的mask左移30位,使1放在最高位,剩下位为0。然后和num 做&运算直到不得0为止,mask要一直右移,此时mask会停留在num的最高位1处,然后将mask左移一位,再减1得到掩码

int mask = 1 << 30;
while ((num & mask) == 0) mask >>= 1;
mask = (mask << 1) - 1;

 

3 用numnum左移的数字或运算,赋给num速度最快),例如对于 10000000 这样的数要扩展成 11111111,可以利用以下

方法:

本例,我们想求 num=1000 0000 的mask(1111 1111)

int num=1000 0000
int mask = num
mask |= mask >> 1   11000000  //将num右移一位得到 0100 0000,然后与原始的num(1000 0000)进行或运算,得到mask(1100 000)
mask |= mask >> 2   11110000  //将刚得到的mask再右移一位得到 0011 0000,然后与上一步得到的mask(1100 0000)进行或运算,得到新mask(1110 0000)
mask |= mask >> 4   11111111  //我们再次将刚得到的mask右移4位,得到0000 1111,然后与上一步得到的mask进行与运算,得到1111 1111

 

int mask = num; //首先令mask等于num。为求num的mask做准备
mask |= mask >> 1;
mask |= mask >> 2;
mask |= mask >> 4;
mask |= mask >> 8;
mask |= mask >> 16;

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值