二进制中1的个数

来源:互联网 发布:2016淘宝官方活动 编辑:程序博客网 时间:2024/06/18 08:41

题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如:把9表示成二进制1001,有2位是1。因此,如果输入9,该函数输出2。

解法1:以9为例,9的二进制表示为1001,可将9与1进行与运算即1001&0001,得到结果为1,表示末尾为1。然后,将1001右移一位,得到0100,在与0001与运算,得到0,表示末尾为0。最终过程为:将输入数与1进行与运算,如果结果为1,则该数的二进制表示中1的个数加一,然后将该数右移一位,直到该数变为0。

function numberOf1($num){$count = 0;while($num!=0){if($num & 1 == 1)$count++;$num = $num >> 1;}return $count;}

该算法只适用正数。因为,如果是负数,右移时最高位会用1填充,就会导致死循环。


解法2:将解法1进行改进,将整数不与1进行与运算,而改为与一个标识flag进行与运算,每次与运算一次后,将flag左移一位,直到flag变为0.

function numberOf1($num){$count = 0;$flag = 1;while($flag){if($num & $flag )$count++;$flag = $flag << 1;}return $count;}

解法3:利用n&(n-1)求解。每次计算n = n & (n-1)后,n最后一位1就会去掉。如9&8得到8,二进制表示为1001&1000=1000;然后8&7=0,二进制表示为1000&0111=0000。当结果为0时,就是结束条件。

function numberOf1($num){$count = 0;while ($num) {$num = $num & ($num-1);$count++;}return $count;}


0 0
原创粉丝点击