对于位运算
位运算就是二进制运算,咱们晓得计算机 cpu 运算最底层的物理实现,就是高低电平输出,形象成数学符号就是二进制 01 输出。因而位运算对 cpu 来说是最高效的,因为咱们用它的“母语”和它交换。
因而,juc 库很多中央都有位运算的影子,就是为了提高效率,有的中央用得奇妙真是让人惊叹,让人大呼还能这样,既优雅又简洁,应了中国的那句老话,大道至简!
使用示例
-
给定一个整型容量 initialCapacity,计算这个容量最近的 2 的 n 的数
initialCapacity = numElements; initialCapacity |= (initialCapacity >>> 1); initialCapacity |= (initialCapacity >>> 2); initialCapacity |= (initialCapacity >>> 4); initialCapacity |= (initialCapacity >>> 8); initialCapacity |= (initialCapacity >>> 16); initialCapacity++;
上述代码翻译成人类语言就是,给定一个数,咱们从二进制的角度看这个数; 比方 8,它的二进制是 1000;把它最高位 1 之后的其余位都变成 1,而后加 1; 即 1000 -> 1111, 加 1 后变成 10000,对应的十进制是 16.
下面这段代码其实是摘自 ArrayDeque 的 allocateElements,其实它还思考了溢出变成正数状况,就是二进制最高位是 1 的状况。
相似的还有 jdk1.8 hash map 的容量初始化修改计算,为啥 cap 要先减去 1,为了使得输出刚好是 2 的 n 次方的数的容量不须要再修改,比方 8,对应的二进制是 1000,减去 1 后的二进制是 0111,对应的十进制是 7,用同样的算法,算出后果是 8,和输出的 8 统一。