用2的幂表示可多项选择的状态

我们在学习linux权限指令时,想必大多数人都会疑惑为啥用1,2,4来表x,w,r的权限,而不是1,2,3就行了。
实际工作中,我们也经常需要用到各种组合的状态,类似权限,每个权限并不唯一只有x,w,r,而是x,w,r任意组合。所以我们就需要任意组合的数字不重复。用2的幂就可以达成这样的效果。用1,2,3的话,比如x和w(1+2=3),就与r重复了。

除了以上任意组合的唯一性外,还有个好处,就是代码可以很好的用到位运算,显得有效率且简洁

比如java nio 的 SelectionKey

 public static final int OP_READ = 1 << 0;
 public static final int OP_WRITE = 1 << 2;
 public static final int OP_CONNECT = 1 << 3;
 public static final int OP_ACCEPT = 1 << 4;

当表示多个组合的时候,用|

int interestSet = SelectionKey.OP_READ | SelectionKey.OP_WRITE;

当判断是否含有某种状态时

public final boolean isReadable() {
        return (readyOps() & OP_READ) != 0;
    }

关于2的幂

由于计算机的识别是二进制的,所以2的幂在项目源码中非常常见。
比如hashmap的数组长度,就是2的幂,有两个原因。
1、2^n & hash = hash % 2^n, 这个是在求key所在的数组位置。只有2的幂,该等式才相等。在源码里基本都是位运算的,效率更好。
2、 2^n 散列的效果是好于其他的。(在其他文章看到的,有例子)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值