到底是什么让我如此激动,跑来写博客划水呢?没办法啊这
public static int bitCount(int i) {
// HD, Figure 5-2
i = i - ((i >>> 1) & 0x55555555);
i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
i = (i + (i >>> 4)) & 0x0f0f0f0f;
i = i + (i >>> 8);
i = i + (i >>> 16);
return i & 0x3f;
}
一串源码也太骚了,这就求出二进制1的个数啦?还这就击败100%的~~?
想必聪明的看官已经看出来是剑指offer那题了,好家伙你就是个api调用工程师(😁🤣哎呀这都被你们发现了)!
回归正题啊,在C/C++中,0x为十六进制的前缀标识,0位八进制的前缀标识,十进制没有前缀标识。所以Java也是如此,毕竟我认为是c++简洁版,~~说不好听点son版, int 8byte 所以32bit 位数 全0全1就不说了 范围 (0x80000000~0x7fffffff)
16进制数 | 2进制 | 特点 |
---|---|---|
0xaaaaaaaa | 10101010101010101010101010101010 | 奇数位为0 ,偶数位为1 |
0x33333333 | 110011001100110011001100110011 | 除最高位外,1和0每隔两位交替出现 |
0x55555555 | 1010101010101010101010101010101 | 奇数位1,偶数位0 |
0xcccccccc | 11001100110011001100110011001100 | 除最高位外,0和1每隔两位交替出现 |
0x0f0f0f0f | 00001111000011110000111100001111 | 1和0每隔四位交替出现 等等你还能推出相反的 |
0xff00 | 1111111100000000 | 共16位 8个1 8个0 |
等等一些,溜了 源码还得缕缕🤣ヾ(≧▽≦*)o 再会咯!