目录
写一个函数返回参数二进制中1 的个数
eg: 15 00001111 有4个1说人话就是:↓↓↓↓↓↓↓↓↓
有几个1啊!
好了不皮了,说正事儿
1.字符串查找法
是自己第一时间的思路,通过方法转换成二进制字符串,在通过索引找出1的次数
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
System.out.println(numberOneCount(num));
}
public static int numberOneCount(int num) {
String binaryString = Integer.toBinaryString(num);//用包装类调用方法转换成二进制字符串
int count = 0;
for (int i = 0; i <binaryString.length() ; i++) {
char c = binaryString.charAt(i); //char c 存储字符串的索引字符
if(c=='1'){
count++; //当索引到字符1时,计数+1;
}
}
return count ;
}
}
2.按位与解法(for循环)
通过位运算和逻辑运算
进一步简洁的同时,达到了目的
只要个位数是1,与1相与就不等于0
无符号右移,在左边补零,右边的个位依次和1相与
直到等于0 ,每不等于一,计数加一
public static int numberOneCount(int num) {
int count = 0;
for (int i = 0; i < num; i++) {//只要个位数是1,与1相与就不等于0
if (((num >>> i) & 1) != 0) { //无符号右移,在左边补零,右边的个位依次和1相与
count++; //直到等于0 ,每不等于一,计数加一
}
}
return count;
}
3.按位与解法(while循环)
原理同上,只是循环形式不同
public static int numberOneCount(int num) {//用while循环写 按位与法
int count = 0;
while (num != 0) {
if ((num & 1) != 0) {
count++;
}
num = num >>> 1;
}
return count;
}
4.减一相与法 (n&(n-1))
因为每次减1相与 , 个位数一直不一致
每次与一个减1的数,就会与掉一个1
只要不等于0,次数加一
public static int numberOneCount(int num) {
int count = 0;
while (num != 0) {
num = num & (num - 1); //因为每次减1相与 , 个位数一直不一致
count++; // 每次与一个减1的数,就会与掉一个1
} //只要不等于0,次数加一
return count;
}
5.同源题--分别取二进制数奇偶位上的数
for (int i = 31; i >= 1; i -= 2) {
System.out.print(((num >> i) & 1)); //求偶位上的数
}
System.out.println(" ");
for (int i = 30; i >= 0; i -= 2) { //奇位
System.out.print(((num >> i) & 1));
}