方案一:
n%2得到 0或1
例:15%2 ==1
n/2得到是去掉二进制位最后一位的0或1
例:15(1111) /= 2 得到7(111)
unsigned int 可以输出负数
// 方法一
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void my_count(unsigned int n)
{
int count = 0;
while (n)
{
if (n % 2 == 1)
{
count++;
}
n /= 2 ;
}
printf("%d\n", count);
}
int main()
{
int n = 0;
scanf("%d", &n);
my_count(n);
return 0;
}
方案二:
"&"
//‘&’按位与 相同出1
// 1的二进制位00000000000000000000000000000001 &
// 例m=15 00000000000000000000000000001111
// &运算后就得00000000000000000000000000000001 (结果出1)
//如果m =14 00000000000000000000000000001110 (结果出0)
">>"
//“>>”右移 把最后一位(右边最后一位去掉) 左边补0
//例: m=15 00000000000000000000000000001111
//右移后得到 00000000000000000000000000001110
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void my_count(int n)
{
int count = 0;
int j = 0;
for (j = 0; j < 32; j++)//32是32位 如果是64位则输入64
{
if ( (n & 1) == 1)
//通过n的二进制位最后一位是否为 为1来判断
//n最后一位为1时 & (按位与)1最后得到就是1 再右移1位
//n不是1为0时 直接右移一位进入下个循环
// 右移 >>丢掉二进制位最后一位然后左边补0
{
count++;
}
n = (n >> 1);
}
int main()
{
int n = 0;
scanf("%d", &n);
my_count(n);
return 0;
}
方案三:
关于 n = n& (n -1)运算过程
// &二进制位 同为1出1
//例:n = 15 (1111)
// n-1 = 14 (1110) &
//
// 新n = 14 (1110)
// n-1 = 13 (1101) &
//
// 新n = 12 (1100)
// n-1 = 11 (1001) &
//
// 新n = 8 (1000)
// n-1 = 7 (0111) &
//
// 新n = 0 (0000)
void my_count(int n)
{
int count = 0;
while (n)
{
n = n & (n - 1);
count++;
}
printf("%d\n", count);
}
int main()
{
int n = 0;
scanf("%d", &n);
my_count(n);
return 0;
}