当前位置:   article > 正文

E24.【C语言】练习:求一个整数存储在内存中的二进制中1的个数(两种方法)

E24.【C语言】练习:求一个整数存储在内存中的二进制中1的个数(两种方法)
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. int main()
  4. {
  5. int n = 0;
  6. int sum = 0;
  7. scanf("%d", &n);
  8. while (n!=0)
  9. {
  10. if (n % 2 == 1)
  11. sum++;
  12. n = n / 2;
  13. }
  14. printf("%d", sum);
  15. }

代码可以更简洁

while (n!=0)直接写成while (n)

对于正整数:原码==反码==补码

但对于负数来说,本代码有缺陷:负数在内存中以补码形式存储


思路1:&

需要使用操作符对二进制位一个一个取出-->复位(AND)-->&

输入n(int型),检查n的最右位,再将n>>=1;,一直检查32次

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. int main()
  4. {
  5. int n = 0;
  6. int a = 1;
  7. int sum = 0;
  8. scanf("%d", &n);
  9. for (int i = 1; i <= 32; i++)
  10. {
  11. if ((n & a) == 1) //为了指明运算顺序,加括号
  12. {
  13. sum++;
  14. }
  15. n >>= 1;
  16. }
  17. printf("%d", sum);
  18. }

 


思路2 &升级版(推荐)

n=n&(n-1)

输入13-->1101-->1100-->1000-->0000(让二进制序列中最右边的1消失)

发现:执行一次拿走一个1-->设计一个while来统计1的个数

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. int main()
  4. {
  5. int n = 0;
  6. int sum = 0;
  7. scanf("%d", &n);
  8. while (n)
  9. {
  10. n = n & (n - 1);
  11. sum++;
  12. }
  13. printf("%d", sum);
  14. }

题外话:n=n&(n-1)的其他应用

输入n,判断n是否为2的次方数

8:1000;16:10000;……-->发现二进制序列中只有一个1

-->判断一次即可 if ((n&(n-1))==0) 如果成立,即为2的次方数

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/951982
推荐阅读
相关标签
  

闽ICP备14008679号