一个很简单的问题,估计很多人看到之后已经有了自己的思路。

不过这不一定是个最好的思路。

普通方法这里就不说了,说说今天看到的一个算法,觉得自己想不到,所以写在这里。

怎么解决呢?

很简单的一段程序

int num = 0;
 while(v) {
 v &= v-1
 num++;
 }

最后的num值就是个数。也就是说算法时间复杂度就是1的个数!

怎么理解呢?

如果某一位上有1,而后面的都是0,会怎么样呢。比如1010000,这个数减一之后,后面的五位都会取反,变为1001111

再与一下!变为1000000

看到了吗?直接把一个1变为0了,也就是这次操作后有一个1。

接着往下走,继续把1000000减一,再与一下,最后变为0000000

 

总结,1010000有两个1,经过两次操作,变成了0!

反过来,经过两次操作,变成0,那就是有两个1!

 

有兴趣可以实现下~
还可以用数学方法证明一下~

发表评论

邮箱地址不会被公开。 必填项已用*标注