目录
题目描述:
思路:输入一个数字,将对应的十进制数字转化为二进制数字,将二进制的数字按位与1,如果二进制的对应位也是1的话则结果为1,如果对应位为0的话结果是0。
这里需要掌握:
按位与:
对应位上,如果有0,就是0。
用途:寻找对应位是不是都是0。
按位或:
对应位上有1,结果就是1。
按位异或:
对应位上不一样的进行或操作(对应位上是1,就是1),不一样为1,一样为0。
这里梳理三种不同的方法进行求解。
方法一:
public class Test {
//求二进制数中1的个数
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int a = scan.nextInt();
int count = 0;
for (int i = 0; i < 32; i++) {
if(((a >> i) & 1 ) == 1){
count ++;
}
}
System.out.println(count);
}
}
在控制台输入一个数字,返回对应位置上的二进制1的个数为32。
优化二:
在方法一中,我们可以发现当输入的数字为1的时候,同样的也是移动32次。
用while循环来判断数字是否等于0,如果不等于0,则循环继续,如果等于0,则跳出循环。
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int a = scan.nextInt();
int count = 0;
while (a != 0){
if ((a & 1) == 1){
count ++;
}
a = a >>> 1;
}
System.out.println(count);
}
优化三:
7的二进制数为 00000111
6的二进制数为 00000110
7&6 = 00000110
6的二进制数为 00000110
5的二进制数为 00000101
6&5 = 00000100
5的二进制数为 00000101
4的二进制数为 00000100
5&4 = 00000100
所以,当一个数n,n&(n-1)的时候,二进制位中1的个数会-1。
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int a = scan.nextInt();
int count = 0;
while (a != 0){
a = a & (a - 1);
count ++;
}
System.out.println(count);
}