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;
}