标签: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/>";
标签:echo button while func alt app inter info src
原文地址:https://www.cnblogs.com/573583868wuy/p/9434078.html