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

    题目描述

    输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

    分析:

    方法1:缺点:如果输入的是负数,整数一直做右移运算,会陷入死循环。

    /**
         * 方法1:把整数与1做位与运算,如果结果为1,说明整数最右边一位是1,然后整数右移1位
         * 
         * @param n
         *            整形数据
         * @return 二进制中1的个数
         */
        public static int numberOf1(int n) {
            int count = 0; // 记录1的个数
            // int型占4个字节, 共32位
            for (int i = 0; i < 32; i++) {
                count += (n & 1);
                n >>= 1;
            }
            return count;
        }

    方法2: 循环的次数等于整数的二进制位数

    /**
         * 方法2:把整数与1做位与运算,然后将1左移1位
         * 
         * @param n
         *            整形数据
         * @return 二进制中1的个数
         */
        public static int numberOf2(int n) {
            int count = 0; // 记录1的个数
            // int型占4个字节, 共32位
            int flag = 1;
            for (int i = 0; i < 32; i++) {
                if ((n & flag) != 0)
                    count++;
                flag <<= 1;
            }
            return count;
        }

    方法3:整数中有几个1就循环几次(最优解)

    /**
         * 方法3:把一个整数减去1,再与原整数做与运算,会把整数最右边的1变为0,那么一个整数的二进制中有多少个1就进行多少次这样的操作
         * 
         * @param n
         *            整形数据
         * @return 二进制中1的个数
         */
        public static int numberOf3(int n) {
            int count = 0; // 记录1的个数
            while (n != 0) {
                count++;
                n = n & (n - 1);
            }
            return count;
        }

    类似题型:

      

  • 相关阅读:
    机器学习 -- 用户画像
    机器学习 -- 分类
    机器学习 -- 聚类
    机器学习 -- 回归
    数据分析 -- 流程
    Nginx + Tomcat7 + redis session一致性问题
    机器学习 -- 信息论
    机器学习 -- 统计与分布
    ElasticSearch 学习一: 基本命令
    问题17:如何将多个小字符串拼接成一个大的字符串
  • 原文地址:https://www.cnblogs.com/zywu/p/5767334.html
Copyright © 2011-2022 走看看