生活日用算法——位运算杂谈
最近和人吹水,遇到一些比较巧妙的位运算玩法
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延伸至第二位,在把前两位延伸至前四位,依此类推。