我们在学习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的幂在项目源码中非常常见。 比如hashmap的数组长度,就是2的幂,有两个原因。 1、2^n & hash = hash % 2^n, 这个是在求key所在的数组位置。只有2的幂,该等式才相等。在源码里基本都是位运算的,效率更好。 2、 2^n 散列的效果是好于其他的。(在其他文章看到的,有例子)
新闻热点
疑难解答