法一:
运用位操作符:>>, &等操作符
//统计二进制中1的个数。 int main() { int n = 0; scanf("%d", &n); int count = 0; for (int i = 0; i < 32; i++) { count += ((n >> i) & 1); } printf("%d", count); return 0; }
法二:
运用算数操作符:%和/
int main() { unsigned int n = 0; //注意这个用unsigned int //是保证不管输入的是正数还是负数都能计算。 scanf("%u", &n); int count = 0; while (n > 0) { if (n % 2 == 1) { count++; } n /= 2; } printf("%d", count); return 0; }
法三:
运用位操作符:&
int main() { unsigned int n = 0; //同样这里的unsigned int 和上面的 unsigned int 是一个目的 //防止把负数转化为无符号的很大的数 scanf("%d", &n); int count = 0; while (n > 0) { n = n & (n - 1); count++; } printf("%d", count); return 0; }
拓展: n &(n-1)
例题 :能不能写个代码判断n是不是2的幂次方。(n = 2^m?)
法一:枚举法
枚举法 #include<math.h> int main() { int n = 0; scanf("%d", &n); int m = 0; while ((pow(2, m) <= n)) { if ((pow(2, m) == n)) { printf("%d是2的幂次方",n); break; } m++; } if (pow(2, m) > n) { printf("%d不是2的幂次方", n); } return 0; }
法二:(n = n&(n-1))
int main() { int n = 0; scanf("%d", &n); if ((n & (n - 1)) == 0)//注意这里==的优先级要高于& 前面要加一个() { printf("他是2的幂次方!!!"); } else { printf("他不是2的幂次方!!!"); } return 0; }