1.二进制中1的个数
请实现一个函数,输入一个整数,输出该数的二进制表示中1的个数,
int NumBerOf1(int n)
{
int count = 0;
while(n)
{
if(n&1)
count++;
n = n>>1;
}
return count;
}
讨论上面代码的正确性,移位操作,当对一个正数右移的时候,补充的是0,但是当对一个负数进行移位的时候,从左侧开始补充的是符号位也就是1
当n为正数的时候,代码可以正确得出结果,但是,当输入的n是个负数则n最后可能变成0xFFFFFFFFF,使while陷入死循环。
2.int NumBerOf1(int n)
{
int cont = 0;
unsigned int flag = 1;
while(flag)
{
if(n & flag)
count++;
flag = flag << 1;
}
return count;
}
在这个算法中,循环的次数等于n中二进制的位数,二进制位数有几位那么就循环几次,flag逐渐向左移位,测试整数二进制情况下的所有位是否为一。
3.由第二种算法进行分析,是否可以直接只循环1的个数次,即当二进制位为0的时候不去进行循环,只有当当前的二进制位为1 的时候才进行循环,
int NumberOf1(int n)
{
int count = 0;
while(n)
{
++count;
n = (n-1) & n;
}
}
第三种算法主要运用了二进制转换中的一个知识点,
把一个数减去1与自己本身相与那么二进制形式下最右侧的1变成0
此时进行第三种算法中的while循环的时候,每次都把二进制中的一个1变成0按照这种方式进行递归,最终二进制中1都变成了0.