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

    类似题型:

      

  • 相关阅读:
    java使用AES加密解密 AES-128-ECB加密
    快速集成iOS基于RTMP的视频推流
    iOS视频直播初窥:高仿<喵播APP>
    直播相关的开源库/项目
    iOS 常见 Crash 及解决方案
    命名规范
    实现UITableView循环利用
    最快让你上手ReactiveCocoa之进阶篇
    最快让你上手ReactiveCocoa之基础篇
    带你走进脚本世界,ijkplayer之【init-ios.sh】脚本分析
  • 原文地址:https://www.cnblogs.com/zywu/p/5767334.html
Copyright © 2011-2022 走看看