zoukankan      html  css  js  c++  java
  • 剑指 Offer 15. 二进制中1的个数

    剑指 Offer 15. 二进制中1的个数

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

    示例 1:

      输入:00000000000000000000000000001011
      输出:3
    解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。

    示例 2:

      输入:00000000000000000000000010000000
      输出:1
    解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'。

    示例 3:

      输入:11111111111111111111111111111101
      输出:31
    解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 '1'。

     

    方法一:逐位判断

    根据 与运算 定义,设二进制数字 n ,则有:
    若n&1=0 ,则 n 二进制 最右一位 为 0 ;
    若 n&1=1 ,则 n 二进制 最右一位 为 1 。
    根据以上特点,考虑以下 循环判断 :
    判断 n 最右一位是否为 1 ,根据结果计数。
    将 n 右移一位(本题要求把数字 n 看作无符号数,因此使用 无符号右移 操作)。
    算法流程:
    初始化数量统计变量 res = 0。
    循环逐位判断: 当 n = 0时跳出。
    res += n & 1 : 若n&1=1 ,则统计数 resres 加一。
    n >>= 1 : 将二进制数字 n无符号右移一位 。

     

    代码:

    class Solution {
        public int hammingWeight(int n) {
            int res = 0;
            while(n != 0) {
                res += n & 1;
                n >>= 1;
            }
            return res;
        }
    }

     

     

    方法二:巧用n&(n1)

    (n−1) 解析: 二进制数字 n 最右边的 1 变成 0 ,此 1 右边的 0 都变成 1 。
    n&(n−1) 解析: 二进制数字 n 最右边的 1 变成 0 ,其余不变。

     

    public class Solution {
        public int hammingWeight(int n) {
            int res = 0;
            while(n != 0) {
                res++;
                n &= n - 1;
            }
            return res;
        }
    }

     

    因上求缘,果上努力~~~~ 作者:每天卷学习,转载请注明原文链接:https://www.cnblogs.com/BlairGrowing/p/13546596.html

  • 相关阅读:
    centos 用户管理
    rsync 实验
    文件共享和传输
    PAT 1109 Group Photo
    PAT 1108 Finding Average
    PAT 1107 Social Clusters
    PAT 1106 Lowest Price in Supply Chain
    PAT 1105 Spiral Matrix
    PAT 1104 Sum of Number Segments
    PAT 1103 Integer Factorization
  • 原文地址:https://www.cnblogs.com/BlairGrowing/p/13546596.html
Copyright © 2011-2022 走看看