题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
解题思路
我们先把n和1(只有最后一位是1,前边的位都是0)做与运算(&),如果结果不等于0,说明n的最后一位是1.
然后将1左移一位(倒数第二位是1,其他位都是0),再和n做与运算,这时就可以判断n的倒数第二位是不是1.
不断左移1。
public class MyNumberOf1 {
public static void main(String[] args) {
/*
* 让我先来看看一个数在计算机里是怎么存储的!补码!
int i = 5;//jdk中定义int占四个字节。一个字节 = 8 位 是固定的。所以是32.
int j = -5;
System.out.println(Integer.toBinaryString(i));//101,前边是0,省略啦
System.out.println(Integer.toBinaryString(j));//11111111 11111111 11111111 11111011
*/
MyNumberOf1 m = new MyNumberOf1();
System.out.println(m.NumberOf1(5));
}
public int NumberOf1(int n) {
int count = 0;
int flag = 1;
for (int i = 0; i < 32;i++) {
if ((n & flag) != 0) { //这里(n & 1)括号!运算符优先级!
count++;
}
flag = flag << 1;
}
return count;
}
}