生活日用算法——位运算杂谈

最近和人吹水,遇到一些比较巧妙的位运算玩法

1、如何判断一个数字是2的N次幂?

博主第一反应是可以位运算,但是如何左移和又移是个问题。(循环除以除以2,结果大于1之前一直余数为零当然可以,但是的效率啊。)

此处如果数字为n,只需要n&(n-1)=0,就可以判定此数为2的N次幂

2、如何获取一个数字最近的2的N次幂,比如7->8,9->16,19->32这种。

其实在hashmap的源码里,已经给出了答案,摘抄如下:

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

 因为int最大值是2^32-1,此处做的事情其实是先把首位的1延伸至第二位,在把前两位延伸至前四位,依此类推。

posted @ 2019-07-10 19:25  豆豆323  阅读(189)  评论(0编辑  收藏  举报