对于一个字节(8bit)的无符号整形变量,求其二进制表示中“1”的个数。
1.最简单的也是最容易想到的就是将这个数对2取余,然后再除以2,一直循环到为0。这就是将一个数转换成2进制的方法。
int Count(int n)
{
int sum=0;
while(n)
{
if(n%2==1)
sum++;
n=n/2;
}
return sum;
}
2.一个正数除以2等同与这个正数右移一位,而取余相当于测试这个数的最后一位是不是“1”。从而可得到:
int Count(int n)
{
int sum=0;
while(n)
{
if(n&1==1)
sum++;
n=n>>1;
}
return sum;
}
3.这个方法有点新颖,一个非零数与比它小1的数&操作之后若为0,则表明这个数只有一位是1.例如:
01000 101100
&00111 &101011
00000 101000
从上面可以看到,二个相邻的数,较大的数的从右往左第一个为“1”的位的左边和较小的数一样,而这个位置(包括这个位置)的右边与较小的数相反。
int Count(int n)
{
int sum=0;
while(n)
{
n=n&(n-1);
sum++;
}
return sum;
}
扩展:
1.给定两个正整数(二进制形式表示)a和b,问把a变成b需要改变多少位(bit)?也就是整数a和b的二进制表示中有多少位是不同的。
首先a^b,在计算a^b中有多少个“1”就可以了。
2.不用赋值交换a,b的值。
a=a^b,
b=a^b,
a=a^b.