美文网首页
一段神奇的算法

一段神奇的算法

作者: 行走的鸡汤哥 | 来源:发表于2019-12-29 22:20 被阅读0次

一段神奇的算法

阅读hashmap源码时,看到了一段神奇的代码,如下所示:

static final int tableSizeFor(int cap) {
    int n = cap - 1; // step 1
    n |= n >>> 1; // step 2
    n |= n >>> 2; // step 3
    n |= n >>> 4; // step 4
    n |= n >>> 8; // step 5
    n |= n >>> 16; // step 6
    return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1; // step 7
}

这段代码啥意思呢?这段代码是初始化容量时会调用的,用于计算扩容阈值。
这段代码的目的是为了计算大于等于cap的最小2的幂,如cap=2,输出2;cap=3,输出4;cap=17,输出32。

科普:

n >>> 1:是无符号右位移运算,向右位移1位,左边补0;
n |= n:位或运算,0 | 0 = 0;0 | 1 = 1;1 | 1 = 1;1 | 0 = 1。即只要有1则为1。

以下以cap=121为例:
step 1:n = 120
step 2:
120的二进制形式为:0111 1000
n >>> 1:0011 1100
n |= n:
0111 1000
0011 1100
——————————————————
0111 1100
输出:n = 124
step 3:
124的二进制形式为:0111 1100
n >>> 2:0001 1111
n |= n:
0111 1100
0001 1111
——————————————————
0111 1111
输出:n = 127
step 4:
124的二进制形式为:0111 1111
n >>> 4:0000 0111
n |= n:
0111 1111
0000 0111
——————————————————
0111 1111
输出:n = 127
step 5:
124的二进制形式为:0111 1111
n >>> 8:0000 0000
n |= n:
0111 1111
0000 0000
——————————————————
0111 1111
输出:n = 127
step 6:
124的二进制形式为:0111 1111
n >>> 16:0000 0000
n |= n:
0111 1111
0000 0000
——————————————————
0111 1111
输出:n = 127
step 7:127 > && 127 < MAXIMUM_CAPACITY,输出最终结果:128

此算法巧妙的地方在于,cap的最高位肯定是1,第一次向右位移1位后,再与原值进行位或操作,结果是最高的两位是1。接着向右位移2位再位或,得到最高的四位是1。同理,将得到一连串的1,即为结果。

至于step 1为何要先减去1,目的在于保证结果是大于等于cap的最小2的n次幂。如cap为8,预期的输出也应该为8。若不先减去1,则将输出16,与预期不符。

相关文章

  • 一段神奇的算法

    Arrays.toString() 使用的算法: 而普通的字符串拼接是怎么写的呢? 你品,你细品。

  • 一段神奇的算法

    一段神奇的算法 阅读hashmap源码时,看到了一段神奇的代码,如下所示: 这段代码啥意思呢?这段代码是初始化容量...

  • iOS证书相关概念梳理

    非对称加密 RSA算法原理(一)RSA算法原理(二) 摘要算法 另一个神奇的算法就是摘要算法。摘要算法是指,可以将...

  • 儿子的神奇算法

    那天下午,儿子从幼儿园出来,拿着打着大大的对号的作业炫耀给我看。我大吃一惊:“儿子啥时候学会20以内的加减法的,我...

  • tarjan算法

    tarjan算法前提 一个关于图的联通性的神奇算法。基于DFS(深度搜索)算法,深度优先搜索一张有向图。!注意!是...

  • 摘要算法

    另一个神奇的算法就是摘要算法。摘要算法是指,可以将任意长度的文本,通过一个算法,得到一个固定长度的文本。这里文本不...

  • matlab感悟

    怎么什么东西弄着弄着就变成算法了?好神奇啊

  • 一段神奇的经历

    大家好,我是小胜子。欢迎来到:小胜子成长社群,和一千名职场精英共同进步。今天,我们要聊的是关于思维的一个话题。 在...

  • 一段神奇的旅程

    走了长达三个多月的《世说新语》课程,在这个星期三的时候学完了最后一个人物。在近千则的《世说新语》学习中,我们一...

  • 一段神奇的文字

    感恩神奇文字解读者!谢谢!谢谢!谢谢! 《心经》这是一段神奇的文字,好多人因背诵它而受益! 观自在菩萨(观察内在,...

网友评论

      本文标题:一段神奇的算法

      本文链接:https://www.haomeiwen.com/subject/vfmuoctx.html