zoukankan      html  css  js  c++  java
  • 剑指Offer10-二进制中1的个数

    题目:

    /**
         * 请实现一个函数,输入一个整数,
         * 输出该二进制表示中1的个数。
         * 例如把9表示成二进制是1001, 有2位是1。
         * 因此如果输入9,该函数输出2。
         */

    解题思路:常规的解法可以去遍历整数对应二进制的每一位,比如:数字9的二进制1001,依次将每一位的数字与1进行 与 运算,若结果为1则表明对应的位数为1;

    然后去累积计算1的总体个数。

    代码如下:

    public class No10 {
        public static void main(String[] args) {
            System.out.println(getNum(9));
            
        }
        
        public static int getNum(int num) {
            int count = 0;        //累加器:保存二进制中的个数
            int flag = 1;        //变量,每次循环左移一位
            
            while(flag!=0) {
                //与运算不等于0说明出现了当前二进制位为1的情况
                if((num & flag) != 0)
                    count++;
                flag = flag << 1;
            }
            return count;
        }
    }

    但是因为int在内存中站32位,故这种方法为循环32次;

    有没有一种方法是二进制中有多少个1就循环几次;

    答案是有的:首先要知道一个知识点:把一个整数减去1,然后把减去一的结果与该整数做运算,就会把最右边的1变成0,由此可以统计二进制中1的个数

    代码如下:

    public class No10 {
        public static void main(String[] args) {
            System.out.println(getNum(9));
            
        }
        
        public static int getNum(int num) {
            int count = 0;
            while(num != 0) {
                num = (num-1) & num;
                count++;
            }
            return count;
        }
    }
  • 相关阅读:
    Heartbeat实现热备
    rsync实现数据增量备份
    MySql重置密码
    media viewport
    Java操作Excel之JXL (填充EXCEL模板)转载
    字节流与字符流的区别详解
    GIT和SVN的区别
    oracle与DB2递归查询
    SQL中使用WITH AS提高性能 简化嵌套SQL(转载)
    CVS tag and branch(转)
  • 原文地址:https://www.cnblogs.com/meteorst/p/9234437.html
Copyright © 2011-2022 走看看