zoukankan      html  css  js  c++  java
  • 二进制中1的个数(Java实现)

    问题: 输入一个整数,求其二进制中1的个数

    看到这个问题,我们应该想到数的位运算

    解法一:我们每次将此数&1 ,如果结果等于1,证明此数的最后一位是1,,count++; 然后在将数右移一位,

    循环下去,直到此数==0,即可统计出其中1的个数

    Test1:

     1  private static int getNum1(int i) {
     2         int count=0;
     3         while (i!=0){
     4             if((i&1)==1){
     5                 count++;
     6             }
     7             i= i>>1;
     8         }
     9         return count;
    10     

    缺点:这种情况只能适用于正整数,当为负数时,负数循环右移时是用1来填前面空缺的位置,所以永远都不会等于0,陷入死循环

    解法二:我们的分析就是:把一个整数减去1。再和原整数做与运算,会把该整数最右边的一个1变成0.那么一个整数的二进制表示中有多少个1,就能够进行多少次运算。

    基于这种思路。我们能够写出这种代码:

    Test2:

       private static int getNum1(int i) {
            int count=0;
            while (i!=0){
                i=i&(i-1);
                count++;
            }
            return count;
        }

    这样操作,无论数是正还是负都可以完美求出1的个数

    解法三:我们调用Integer的方法,将i的二进制转为字符串,再依次遍历其中1的个数,也可以完美解决。

    Test3:

        private static int getNum1(int i) {
            int count=0;
         String str=Integer.toBinaryString(i);
            for (int j = 0; j <str.length() ; j++) {
                if(str.charAt(j)=='1'){
                    count++;
                }
            }
            return count;
        }
  • 相关阅读:
    HDU1258 Sum It Up(DFS)
    hdu 1078 FatMouse and Cheese(记忆化搜索)
    HDU1072 Nightmare (bfs+贪心)
    HDU 2102 A计划 经典搜索
    hdu 1180诡异的楼梯(bfs)
    HDU 1065.I Think I Need a Houseboat
    559_N叉树的最大深度
    236_二叉树的最近公共祖先
    589_N叉树的前序遍历
    每天进步一点点
  • 原文地址:https://www.cnblogs.com/jiezai/p/11218743.html
Copyright © 2011-2022 走看看