码迷,mamicode.com
首页 > 其他好文 > 详细

二进制中有多少个1

时间:2018-08-06 23:24:55      阅读:316      评论:0      收藏:0      [点我收藏+]

标签:echo   button   while   func   alt   app   inter   info   src   

描述

计算在一个 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

标签:echo   button   while   func   alt   app   inter   info   src   

原文地址:https://www.cnblogs.com/573583868wuy/p/9434078.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!