• 剑指offer——二进制中1的个数(c++)


    题目描述
    实现一个函数,输入一个整数,输出该数二进制表示中1的个数。
    例如,把9表示成二进制是1001,则输出为2

    常规解法
    首先把n和1做位运算,判断n的最低位是不是1,然后把1左移一位得到2,再把n和2做位运算,判断n的次低位是不是1…这样反复左移。
    循环的次数等于整数二进制的位数,32位的整数需要循环32次。

    class Solution {
    int NumberOfOne(int n){
    int cnt = 0;
    unsigned int flag = 1;
    while(flag){
    if(n & flag){
    ++cnt;
    }
    flag = flag << 1;
    }
    return cnt;
    }
    };
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    惊喜解法
    把一个整数减去1,在和原整数做与运算,会把该整数最右边的1变成0。
    那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作。
    以1100为例,它减去1的结果是1011,再把1100和1011做位与运算,得到的结果是1000,
    然后1000减去1,得到0111,与1000做位与运算,得到的结果是0000,故得到1100有两个1。

    class Solution {
    int NumberOfOne1(int n){
    int cnt = 0;
    while(n){
    ++cnt;
    n = (n - 1) & n;
    }
    return cnt;
    }
    };
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    ---------------------

  • 相关阅读:
    Beta版软件说明书
    团队项目第五天
    cnblogs用户体验评价
    团队项目测试计划
    Alpha版总结会议
    软件使用说明书
    团队绩效考核
    各个小组对于“我爱淘”的评价
    软件工程团队项目评价
    丹佛机场行李系统处理方案
  • 原文地址:https://www.cnblogs.com/ly570/p/11109351.html
Copyright © 2020-2023  润新知