二进制中有多少个1

Posted w&y

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二进制中有多少个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/>";

 

 

以上是关于二进制中有多少个1的主要内容,如果未能解决你的问题,请参考以下文章

二进制中有多少个1

365 二进制中有多少个1

求二进制数中有多少个1

模拟赛01 总结

如何计算bash中一列数据中的连续重复次数?

13 个非常有用的 Python 代码片段