题解 | #查找输入整数二进制中1的个数#

查找输入整数二进制中1的个数

https://www.nowcoder.com/practice/1b46eb4cf3fa49b9965ac3c2c1caf5ad

题解:统计二进制中1的个数,很容易想到的方法是与1进行&运算并右移,但这种方法遇到有符号数会陷入死循环,因为有符号数右移高位默认是补1的,所以这个数字最终会变成0xFFFFFFFF而陷入死循环。为了避免死循环,可以不右移数字,转为先与1进行&运算,然后将1进行左移,这样进行判断的就是次低位了,反复左移,直到结果为0。第三种解法就比较优秀了,因为一个数减去1后和自己做与运算,得到的结果相当于把该数二进制最右边的1变为0,这样一步步将该数二进制的所有位都变为0,即可统计出1的个数。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws IOException {
       BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Scanner scanner = new Scanner(br);
        int result;
        while (scanner.hasNext()){
            result = countNumberOf1InBinary3(scanner.nextInt());
            System.out.println(result);
        }

    }
    // 解法一:通过与1进行&运算并右移,但遇到有符号数会陷入死循环     
    private static int countNumberOf1InBinary1(int num) {
        int count = 0;
        while (num != 0){
            if ((num & 1) == 1) count++;
            num >>= 1;
        }
        return count;
    }
   // 解法二:通过与 1 进行与运算,并将 1 左移,判断每一位是否为1。
      private static int countNumberOf1InBinary2(int n) {
       int count = 0, flag = 1;
        while (flag != 0) {
            if ((n & flag) != 0)
                count++;
            flag = flag << 1;
        }
        return count;
    }
    // 解法三: 一个数减去1后与自身进行与运算,得到的结果相当于把该数二进制最右边的1变为0      
    private static int countNumberOf1InBinary3(int n) {
        int count = 0;
        while (n != 0) {
            n = (n - 1) & n;
            count++;
        }
        return count;
    }  
 }        


#笔试刷题#
全部评论

相关推荐

10-09 00:50
已编辑
长江大学 算法工程师
不期而遇的夏天:1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务