php算法求出一个数可以被分解成多少个_php实现统计二进制内1的个数算法步骤详解...

这次给大家带来php实现统计二进制内1的个数算法步骤详解,php实现统计二进制内1的个数算法的注意事项有哪些,下面就是实战案例,一起来看一下。

问题

输入一个十进制整数,输出该数二进制表示中1的个数。其中负数用补码表示。

解决思路

这是个位运算的题目。

解法一:可以通过按位与操作,通过将每一位和1与操作来求出1的个数。

解法二(最优解):一个巧妙的方法,一个不为0的二进制数,肯定至少有一位是1,当这个数减一的时候,它的最后一位1会变为0,后边的所有0会变为1。比如10100,减一之后会变为10011,然后用原数字10100和10011进行与操作之后,会得到10000,也就是通过这个操作,可以将一个1变为0,所以一个二进制数字能进行多少次这样的操作,就有多少个1.

实现代码//解法一

function NumberOf1($n)

{

$count = 0;

$flag = 1;

while ($flag != 0) {

if (($n & $flag) != 0) {

$count++;

}

$flag = $flag << 1;

}

return $count;

}// 解法二

function NumberOf1($n)

{

$count = 0;

if($n < 0){ // 处理负数

$n = $n&0x7FFFFFFF;

++$count;

}

while($n != 0){

$count++;

$n = $n & ($n-1);

}

return $count;

}//测试

$num=45;

echo $num."的二进制是".decbin($num)."
";

echo $num."共有".NumberOf1($num)."个1";

运行结果:

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值