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

  • 相关阅读:
    一个误解: 单个服务器程序可承受最大连接数“理论”上是“65535”
    Memcached 命令简介
    MySQL性能测试
    WCF 面向服务的SOAP消息
    WCF SOAP消息剖析
    深入探析 socket
    C#设计模式(适配器模式)
    LoadRunner中的异常处理
    反射调用性能比较(附源码)
    避免 TCP/IP 端口耗尽
  • 原文地址:https://www.cnblogs.com/BlairGrowing/p/13546596.html
Copyright © 2011-2022 走看看