关键词搜索

源码搜索 ×
×

求一个数的二进制数有几个1

发布2021-11-21浏览792次

详情内容

目录

方法一:累除法

方法二:位操作法

方法三:位操作法2.0

方法一:累除法

  1. #include<stdio.h>
  2. //方法1:累除法
  3. int count_num(unsigned int n)
  4. {
  5. int count = 0;
  6. while (n)
  7. {
  8. if (n % 2 == 1)
  9. count++;
  10. n /= 2;
  11. }
  12. return count;
  13. }
  14. int main()
  15. {
  16. int n = 0;
  17. scanf("%d", &n);
  18. //n=5 000101
  19. int ret = count_num(n);
  20. printf("%d\n", ret);
  21. return 0;
  22. }

这里注意:值传递的时候要把n设为unsigned int 即无符号整形

原因,不设置只能求正数的位数,正数原反补相同,所以可以正常使用

        而负数是以补码的形式存储在内存中且最高位为符号位,不参与运算,设置为unsigned int最高位便可以参与运算,而非符号位了。

方法二:位操作法

  1. #include<stdio.h>
  2. int count_num(int n)
  3. {
  4. int count = 0;
  5. int a = 32;
  6. while (i--)
  7. {
  8. if ((n & 1) == 1)
  9. count++;
  10. n >>= 1;
  11. }
  12. return count;
  13. }
  14. int main()
  15. {
  16. int n = 0;
  17. scanf("%d", &n);
  18. n=5 000101
  19. int ret = count_num(n);
  20. printf("%d\n", ret);
  21. return 0;
  22. }

根据以前的笔记,n的二进制补码向右移动一位,有算数右移和逻辑右移,为保险起见,循环次数为32位,防止因为不同编译器右移方式不同而出错。

方法三:位操作法2.0

这里出示一个nb的做法

n&(n-1)这个表达式可以将n的二进制补码的最后一位剥离出来,十分美妙。

举例子

00000000000000000000000000000101   5 的补码

00000000000000000000000000000100   (5-1)的补码

按位与&  可得

00000000000000000000000000000100    剥离出了最低位的1

循环可知最后结果

  1. #include<stdio.h>
  2. int count_num(int n)
  3. {
  4. int count = 0;
  5. while (n)
  6. {
  7. count++;
  8. n = n & (n - 1);
  9. }
  10. return count;
  11. }
  12. int main()
  13. {
  14. int n = 0;
  15. scanf("%d", &n);
  16. int ret = count_num(n);
  17. printf("%d\n", ret);
  18. return 0;
  19. }

注意:应该先计数,再使用完美的公式。

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载