本文主要是介绍1的个数和2的幂等数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1.整数作为二进制1的个数(编程之美当中有出现)
2.判断整数是否为2的幂等数(例如 1,2,4,8,16,32...)
3.某个整数的下一个2的幂等数或者该数就是2的幂等数
(一) 支持无符号整数(一般方法)
public static int numberOfOneForUnsignedBinary(int n){int count = 0;int i = n;while(i != 0){count += (i & 1);i = i >> 1;}return count;}
(二)支持所有整数(32位整形)
public static int numberOfOneForBinary(int n){int count = 0;int i = n;int leftMoveMask = 1;while(leftMoveMask != 0){count += ((i & leftMoveMask) != 0 ? 1 : 0);leftMoveMask = leftMoveMask << 1;}return count;}
(三)支持所有整数(技巧性强)
public static int numberOfOneForBinary2(int n){int count = 0;int i = n;while(i != 0){count++;i = (i - 1) & i;}return count;}
(四)支持无符号整数(空间换时间)
public static int numberOfOneForUnsignedBinaryReadTable(int n){int[] bitTable4 = {0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4};int i = n;int count = 0;while(i != 0){count += bitTable4[0xf & i];i = i >> 4;}return count;}
(五)支持所有整数(平行二分算法,技巧性太强)
public static int numberOfOneForBinary3(int v){ v = (v & 0x55555555) + ((v >> 1) & 0x55555555) ; v = (v & 0x33333333) + ((v >> 2) & 0x33333333) ; v = (v & 0x0f0f0f0f) + ((v >> 4) & 0x0f0f0f0f) ; v = (v & 0x00ff00ff) + ((v >> 8) & 0x00ff00ff) ; v = (v & 0x0000ffff) + ((v >> 16) & 0x0000ffff) ; return v ; }
判断是否为2的幂等数
/** returns true if n is a power of two or zero*/
public static boolean isPowerOfTwo(int n){return ((n & (n - 1)) == 0);}
某个整数的下一个2的幂等数或者该数就是2的幂等数或者0
/** returns the next highest power of two, or the current value if it's already a power of two or zero*/
public static int nextHighestPowerOfTwo(int v) {v--;v |= v >> 1;v |= v >> 2;v |= v >> 4;v |= v >> 8;v |= v >> 16;v++;return v;}
这篇关于1的个数和2的幂等数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!