示例: 输入7,输出3
方法一 : 假设输入7时,它的二进制表示为: 00000000 00000000 00000000 00000111
判断n是否为1—— 不是一则右移一位,同时count++(总数+1)
int Number1(int x)
{
int count = 0; // 存放总数
while (x != 0)
{
count++;
x = x >> 1;
}
return count;
}
int main()
{
int n = 0;
scanf("%d", &n); // 输入n
printf("%d\n",Number1(n)); // 向函数传参,并将函数运行结果作为返回值传给printf,打印
return 0;
}
这段代码,当n为负数时,无法计算出正确结果,需要在函数形参定义时,将x定义为无符号整型,unsigned int x
方法二:& 按位与 同样假设输入为7,二进制:00000000 00000000 00000000 00000111
1 :00000000 00000000 00000000 00000001
n&1:00000000 00000000 00000000 00000001
当我们需要判断这个数的最后一位是0还是1时,只需要将这个数(n)(按位与)&1
我们可以发现,n&1=1,则n的二进制最后一位就是1,反之则为0
下面只留下函数的实现,不再重复main函数
int Number1(int x)
{
int count = 0; // 总数
while (x != 0) // 判断,循环
{
if ((x & 1) == 1) // 最后一位为1
{
count++; // 总数+1
}
x = x >> 1; // x右移
}
return count;
}
方法三:n = n&(n-1)的方法
为了方便观察,只写出最后二进制的最后四位,这里我们假设输入为10
n:1010
n-1:1001
n=n&(n-1): 1000
n-1 : 0111
n=n&(n-1): 0000
也就是说,输入一个数n后,只需要与 n-1进行 &,直到n为0
如果 n 不等于 0,那么它的二进制中肯定有 1,而 n&(n-1),每次可以消去二进制形式中从右开始遇到的第一个1(过程如上),直到n=0。
int Number1(int x)
{
int count = 0;
while (x != 0)
{
x = x & (x - 1);
count++;
}
return count;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)