/**
* Integer.MAX_VALUE = 2147483647 十进制 2^31-1
* Integer.MAX_VALUE = 1111111111111111111111111111111 二进制 31个1(注:省略了最前面的符号位0)
*
* Integer.MIN_VALUE = -2147483648 十进制 -2^31
* Integer.MIN_VALUE = 10000000000000000000000000000000 二进制 31个0
*
*/
public class BitOperation {
/**
* 使用按位与运算:
* 1)依次使用flag(flag取值:0001、0010、0100 ……) 和 整数n 做按位与操作,一共操作31次。
* 2)若按位与的结果等于flag,则证明整数n的二进制表示中,该位上的数字为1。
*
* @param n
* @return
*/
private static int getNumberOf1InBinary(int n) {
int count = 0;
int flag = 1;
while (flag > 0) {
if ((n & flag) == flag) count++;
flag = flag << 1;
}
return count;
}
/**
* 让 n 和 n-1 做按位与操作,
* 说明:
* 1)整数n 和 整数n-1 做按位与操作,按位与的结果==将该整数最右边的1变成0后的值。 eg: 1011 & 1010 = 1010
* 2)一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作。
*
* 缺点:n必须是正整数。
*
* @param n
* @return
*/
private static int getNumberOf1InBinary2(int n) {
int count = 0;
while (n > 0) {
count++;
n = n & (n - 1);
}
return count;
}
public static void main(String[] args) {
int target = 111;
int i = getNumberOf1InBinary2(target);
int i2 = getNumberOf1InBinary(target);
System.out.println(i);
System.out.println(i2);
System.out.println("--------");
System.out.println(Integer.toBinaryString(target));
}
}