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;
        }

    类似题型:

      

  • 相关阅读:
    MD支持新标签跳转
    线上问题cpu100处理记录
    OpenShift 4.6方式下OperatorHub的变化
    OpenShift 4.5.7 版本基础镜像下载
    GLPI企业使用(一),连接AD域,LDAP登录。
    GLPI配置文件说明:默认权限组
    企业服务器规划
    港股通转托管
    mui实现下拉刷新以及click事件无法响应问题
    asp.net core+websocket实现实时通信
  • 原文地址:https://www.cnblogs.com/zywu/p/5767334.html
Copyright © 2011-2022 走看看