题目描述:
输入一个10进制数字,请计算该数字对应二进制中0的个数,注意左数第一个1之前的所有0都不需要计算。不需要考虑负数的情况。
思路分析:
首先要注意不是统计所有的0,而是统计第一个1之后的0 要使用位运算,如何判断什么时候停止,首先判断一共包含n个1,然后对数字进行右移n次,每次和1进行与运算,统计0的数量注意:
对于机试,一定注意心细,慢慢的写,注意变量的对错,另外注意变量的初始化代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
System.out.println("srart");
Scanner scan = new Scanner(System.in);
while(scan.hasNext()){
int n = scan.nextInt();
int count = numberOfZero(n);
if( count >= 0){
System.out.println(count);
}
}
scan.close();
}
//统计n中的0的个个数,注意从左边开始的第一个1之前的0不统计
public static int numberOfZero(int n){
//统计n的1的个数
int countOfOne = 0;
//统计计算的截止数字
int count = 0;
//统计0的个数
int countOfZero = 0;
int input = n;
countOfOne = numberOfOne(n);
while(input != 0){
if((input & 1) == 1){
count++;
if(count == countOfOne){
break;
}
}else{
countOfZero++;
}
input = input >>1;
}
return countOfZero;
}
//统计n中1的个数
public static int numberOfOne(int n){
int count = 0;
while(n != 0){
n = n & (n-1);
count++;
}
return count;
}
}