位运算杂谈

匿名 (未验证) 提交于 2019-12-02 23:47:01

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

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延伸至第二位,在把前两位延伸至前四位,依此类推。

转载请标明出处:位运算杂谈
文章来源: 位运算杂谈
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!