求二进制中1的个数,你们三种看到这个问题,会想到什么方法?这里我提供方法:(最后一位是一位大神想出来的,很牛逼!)慢慢往下看。
1)
int Count_One_Bits(int value)
{
int count = 0;
while(value)
{
if(value%2 == 1)//这个数模2为1,则此位就为1
{
count++;
}
value = value/2;
}
return count;
}
2)在计算机中数的存储是由32位0,1代码组成的(当然是位操作系统中)所以我们采取如下的方式进行计算。
int Count_One_Bits(int value)
{
int count = 0;32
int i = 0;
for(i = 0; i<32; i++)
{
if(((value>>i)&1) == 1)
{
count++;
}
}
return count;
}
3)刚才说了,有一个神奇的公式,此公式就是n = n&(n-1)。我来解释下这个公式是如何进行求解一个数的二进制位个数的。举个例子:(在32位操作系统下)
A:比如求15,15在计算机中的存储就是0000 0000 0000 0000 0000 0000 0000 1111
我们为了方便说明期间,就只取后4位进行研究。那么15就是1111
B:来看这个公式n = n&(n-1),此时的n就是15,n-1 = 14,即就是1110,它们俩&运算之后结果就是1110,依次类推:14&13结果就是1100,最终就会变成0000。说到这里,聪明的你似乎发现了什么。是的,这个公式就是将逐位清零,你有多少个1,就循环清多少次。我们来看下代码:
int Count_One_Bits(int value)
{
int count = 0;
while(value)
{
if(value%2 == 1)
{
count++;
}
value = value/2;
}
return count;
}