乐趣区

关于位运算:位运算的使用

对于位运算

位运算就是二进制运算,咱们晓得计算机 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 统一。

退出移动版