netty中有个选择器,根据元素个数是不是2的幂次来实现,思路类似于HashMap中默认数组大小为2的幂次。
那么如何判断一个数n是2的幂次呢?
netty中用的是(n & (-n)) == n
原理:如果n是2的幂次:其二进制形式大概是:000...1000... 而-n的二进制为:111...1000...,1后面的0的个数一样,按位与可知与n相等
其实还可以这样判断 n & (n - 1) == 0
这个思路大概来源于判断一个数的二进制表示中有多少个1,每次与都会得到二进制中最后一个1变为0的效果,如果只有1个1,当然结果为0,同时也说明n是2的幂次。