zoukankan      html  css  js  c++  java
  • 二进制中有多少个1

    描述

    计算在一个 32 位的整数的二进制表示中有多少个 1.

    您在真实的面试中是否遇到过这个题?  

    样例

    给定 32 (100000),返回 1

    给定 5 (101),返回 2

    给定 1023 (1111111111),返回 10

    思路

    位移+计数

    二进制算法:将正的十进制数除以二,得到的商再除以二,依次类推知道商为零或一时为止,然后在旁边标出各步的余数,最后倒着写出来,高位补零就OK

    eg:

    代码

     1 <?php
     2 //计算在一个 32 位的整数的二进制表示中有多少个1
     3 /**
     4  * 方法一
     5  * 每次对2取余,余数为1的个数即为二进制中1的个数(当num较大时,效率最低)
     6  */
     7 function solution1($num)
     8 {
     9     $count = 0;
    10     while($num!=0)
    11     {
    12         if($num % 2 == 1)
    13         {
    14             $count++;
    15         }
    16         $num = floor($num / 2);
    17     }
    18     return $count;
    19 }
    20 
    21 /**
    22  * 方法二(效率比方法一高)
    23  * num跟1作与运算
    24  * num右移一位
    25  */
    26 function solution2($num)
    27 {
    28     $count = 0;
    29     while($num!=0)
    30     {
    31         if($num & 1 == 1)
    32         {
    33             $count++;
    34         }
    35         $num >>= 1;
    36     }
    37     return $count;
    38 }
    39 
    40 /**
    41  * 方法三(效率最高,其运算次数与输入num的大小无关,只与num中1的个数有关)
    42  * num & num-1能清除num最右边的1
    43  * eg:8(1000)= 7(0111)+ 1(0001),所以8 & 7 = (1000)&(0111)= 0(0000),清除了8最右边的1
    44  *    7(0111)= 6(0110)+ 1(0001),所以7 & 6 = (0111)&(0110)= 6(0110),清除了7的二进制表示中最右边的1
    45  * 
    46  */
    47 function solution3($num)
    48 {
    49     $count = 0;
    50     while($num!=0)
    51     {
    52         $num &= $num -1;
    53         $count++;
    54     }
    55     return $count;
    56 }
    57 
    58 echo solution1(1023) . "<br/>";
    59 echo solution2(1023) . "<br/>";
    60 echo solution3(1023) . "<br/>";
  • 相关阅读:
    记一次Postgres CPU爆满故障
    Bug 28450914 : ORA-600: [KDLRCI_GET_INLINE_DATA] SELECTING FROM CDB_FEATURE_USAGE_STATISTICS
    获取数据表中列的描述值
    【自考】数据结构第四章树和二叉树,期末不挂科指南,第6篇
    SqlServer视图查询效率测试
    MySQL中使用group by 是总是出现1055的错误
    redis中key键操作
    SQL Server等待事件&mdash;PAGEIOLATCH_EX
    MySQL 什么是索引?
    计算经历的时间
  • 原文地址:https://www.cnblogs.com/573583868wuy/p/9434078.html
Copyright © 2011-2022 走看看