华为机试题-判断二进制中0的个数【4】

这篇博客介绍了华为机试中的一道题目,要求计算10进制数对应的二进制表示中,第一个1之后0的个数。作者提供了思路分析,强调需注意统计范围,并分享了利用位运算解决问题的代码实现。同时,提醒考生在机试时要细心操作,确保变量正确初始化。
摘要由CSDN通过智能技术生成

题目描述:

输入一个10进制数字,请计算该数字对应二进制中0的个数,注意左数第一个1之前的所有0都不需要计算。不需要考虑负数的情况。

我之前的博客讲过类似的问题,博客地址如下:

http://blog.csdn.net/lpjishu/article/details/51323722

思路分析:

  • 首先要注意不是统计所有的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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值