- 题目:求解一个整数的二进制表示中1的个数。比如6的二级制为110,则结果为2。
- 解题方法:
2.1 方法一:用1与整数的每一位做与运算,如果该位与1的结果为1则表示该位为1。
方法一代码
import java.util.Scanner;
public class 二进制中1的个数 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
System.out.println(Integer.toString(N, 2)); //二进制显示
int count = 0;
String s = Integer.toString(N, 2);
for(int i = 0; i < s.length(); ++i){
if(s.charAt(i) == '1')
count++;
}
System.out.println(count);
//方法一:与1相与,比对每一位
//移动1
count = 0;
for(int i = 0; i < 32; i++){
if((N&(1<<i)) == (1<<i)){ //用N的每一位与1做与运算,如果该位与1的结果为1表示该二进制位为1
++count;
}
}
System.out.println(count);
count = 0;
//移动输入的整数
for(int i = 0; i < 32; i++){
if (((N>>i)&1) == 1){
count++;
}
}
System.out.println(count);
2.2 方法二:利用N&(N-1)
操作会将N中最低位的1变成0的规律。所以每进行一次N&(N-1)
就会消掉一个1,计数一次,直到为0终止算法。
方法二代码:
import java.util.Scanner;
public class 二进制中1的个数 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
System.out.println(Integer.toString(N, 2)); //二进制显示
int count = 0;
while(N != 0){
N = N & (N-1); //妙
count++;
}
System.out.println(count);
}
}
补充福利:判断一个整数是不是2的次方?
import java.util.Scanner;
/**
* 思路:2的整数次方的二进制数只有一个1
*/
public class 是不是2的整数次方 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(true) {
int N = scanner.nextInt();
if ((N & (N - 1)) == 0) {
System.out.println(N + "是2的整数次方");
} else {
System.out.println(N + "不是2的整数次方");
}
}
}
}