常见的一个方法是:
x&(x-1) 的作用是对一个数中二进制1的个数进行统计
x|(x+1) 的作用是对一个数中二进制0的个数进行统计
今天做牛客网上的题,又学习到了一个新的算法,叫做平行算法,用来计算二进制的1的个数
intBitCount(unsigned int n)
{
n = (n &0x55555555) + ((n >>1)&0x55555555) ;
n = (n &0x33333333) + ((n >>2)&0x33333333) ;
n = (n &0x0f0f0f0f) + ((n >>4)&0x0f0f0f0f) ;
n = (n &0x00ff00ff) + ((n >>8)&0x00ff00ff) ;
n = (n &0x0000ffff) + ((n >>16)&0x0000ffff) ;
return n ;
}
速度不一定最快,但是想法绝对巧妙。 说一下其中奥妙,其实很简单,先将n写成二进制形式,然后相邻位相加,重复这个过程,直到只剩下一位。
以217(11011001)为例,有图有真相,下面的图足以说明一切了。217的二进制表示中有5个1。