【题目描述】输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
【解题思路1】
//1.利用库函数转化为二进制数,然后将二进制数转为字符数组。
//2.遍历数组,计数1的个数。
public class Solution {
public int NumberOf1(int n) {
int count = 0;
String str = Integer.toBinaryString(n);
char[] chs = str.toCharArray();
for(char ch: chs){
if(ch == '1'){
count++;
}
}
return count;
}
}
【解题思路2】
//1. 逐位检查是否为1。
//2. 1的二进制是 前面都是0,最后一位为1,也就是只有一个1,每次向左移位一下,使得flag的二进制表示中始终只有一个位为1,每次与n做位与操作,这样就相当于逐个检测n的每一位是否是1了。
private int NumberOf1_low(int n) {
int count = 0;
int flag = 1;
while (flag != 0) {
if ((n & flag) != 0) {
count++;
}
flag = flag << 1;
}
return count;
}
【解题思路3】
//1. 将二进制表示中最右边为1的位变为0,直到所有的1都变为0。则原数变为0。
//2. 实现步骤1的实现为n=n&(n-1)
。考虑一个数字的二进制表述可以出现两种情况。
//3. 当前状态时,最右一位,要么为1,要么为0。如果最右边一位为1,则n-1后,最低位变为0,与原数n做&操作,原数最低位肯定也变为0。若最低位为0,则n-1时,会向高位产生借位,最右边的1,会变为0,而它右侧的所有0变为1,如1010-1 变为1001,此时两数做&操作,最右侧1所在的位置,也会变为0。综合以上两种情况,n&(n-1)
可以实现将最右侧1变为0。
public class Solution {
public int NumberOf1(int n) {
int count = 0;
while(n!= 0){
count++;
n = n & (n - 1);
}
return count;
}
}