直接将该数的二进制的每一位与1进行按位与(&)运算,算出所有结果为1的数有多少就是所求结果,代码如下
解法一:数不动1动
@Test
/** * 思路:将这个数的二进制的每一位都与1进行按位与计算, * 当结果等于1移位后的结果时说明这个数的二进制的这一位是1 * 详见代码 */
public void test2() {
int a = 1000;
//输出一个数字的二进制形式用Integer.toBinaryString()方法
System.out.println(Integer.toBinaryString(a));
int result = 0;
//整数的二进制是32位制的循环32次
for (int i = 0; i < 32; i++) {
if ((a & (1 << i)) == (1 << i)) {
result++;
}
}
System.out.println(result);
}
解法二:1不动数动
@Test
/** * 这种方法是1不动,将原来的数向右移与1进行按位与运算,结果为一时 * result就++,所得就是结果 */
public void test3() {
int a = 10;
//输出一个数字的二进制形式用Integer.toBinaryString()方法
System.out.println(Integer.toBinaryString(a));
int result = 0;
//整数的二进制是32位制的循环32次
for (int i = 0; i < 32; i++) {
if (((a>>i)&1)==1){
result++;
}
}
System.out.println(result);
}
解法三:巧妙使用按位与运算
@Test
/** * 解法3:从右到左消去1 * 方法为将原数减一与自己做按位与运算,一直算到结果为0时结束 * 循环的次数就是1的个数 */
public void test4() {
int a = 10;
//输出一个数字的二进制形式用Integer.toBinaryString()方法
System.out.println(Integer.toBinaryString(a));
int result = 0;
while (a != 0) {
a = ((a - 1) & a);
result++;
}
System.out.println(result);
}