【C语言】输入一个整数,输出该数二进制表示中1的个数,其中负数用补码表示

简介: 输入一个整数,输出该数二进制表示中1的个数,其中负数用补码表示

方法一:count计数法


#include<stdio.h>
int count_bit_one(unsigned int num)//负数的源码和补码不相同,所以把负数的二进制补码转化成对应的无符号的源码的数。正数的源码和补码相同。
{
    //此方法是对一个数的二进制源码进行操作的
  int count = 0;
  while (num)
  {
  if (num % 2 == 1)
  {
    count++;
  }
  num /= 2;
  }
  return count;
}
int main()
{
  int num = 0;
  scanf("%d", &num);
  printf("%d\n", count_bit_one(num));
  return 0;
}


方法二:按位与法(普通版)


#include<stdio.h>
int count_bit_one(int num)
{
  int i = 0;
  int count = 0;
  for (i = 0; i < 32; i++)
  {
  if (((num >> i) & 1) == 1)
  {
    count++;
  }
  }
  return count;
}
int main()
{
  int num = 0;
  scanf("%d", &num);
  printf("%d\n", count_bit_one(num));
  return 0;
}


方法三:按位与法(高效率版)


#include<stdio.h>
int count_bit_one(int num)
{
  int count = 0;
  while (num)
  {
  count++;
  num = num & (num - 1);//每进行一次这个操作,num的二进制表示中就少一个1,直到最后全为0
  }
  return count;
}
int main()
{
  int num = 0;
  scanf("%d", &num);
  printf("%d\n", count_bit_one(num));
  return 0;
}


运行结果


20210131150746114.png

image.png

相关文章
|
1月前
|
存储 网络协议 算法
【C语言】进制转换无难事:二进制、十进制、八进制与十六进制的全解析与实例
进制转换是计算机编程中常见的操作。在C语言中,了解如何在不同进制之间转换数据对于处理和显示数据非常重要。本文将详细介绍如何在二进制、十进制、八进制和十六进制之间进行转换。
44 5
|
1月前
|
C语言
【C语言】原码、反码、补码详解 -《码上有道 ! 》
在计算机科学中,整数的表示方式有多种,包括原码、反码和补码。这些表示方式主要用于解决整数的二进制表示和计算问题。本文将详细介绍这三种表示方法,并通过示例来说明它们的原理和应用,特别是它们在C语言中的应用。
172 5
|
7月前
|
C语言
【C语言刷题每日一题#牛客网BC6】输入三个整数,输出第二个整数
【C语言刷题每日一题#牛客网BC6】输入三个整数,输出第二个整数
|
7月前
|
C语言
C语言:从键盘读入三个整数,按从大到小输出
C语言:从键盘读入三个整数,按从大到小输出
|
7月前
|
存储 C语言
【C语言刷题系列】求一个数组中两个元素a和b的和最接近整数m
【C语言刷题系列】求一个数组中两个元素a和b的和最接近整数m
|
7月前
|
C语言
【C语言刷题每日一题】——求1到100中包含数字9的整数的个数
【C语言刷题每日一题】——求1到100中包含数字9的整数的个数
|
7月前
|
C语言
【C语言刷题系列】交换整数的奇数位和偶数位
【C语言刷题系列】交换整数的奇数位和偶数位
|
7月前
|
存储 C语言
【C语言进阶篇】整数在内存的存储——原码、反码、补码
【C语言进阶篇】整数在内存的存储——原码、反码、补码
|
7月前
|
C语言
【C语言刷题系列】计算整数的二进制位中1的个数 (三种方式)
【C语言刷题系列】计算整数的二进制位中1的个数 (三种方式)
|
C语言
《C语言及程序设计》实践参考——分离整数和小数部分
返回:贺老师课程教学链接  C语言及程序设计初步  项目要求 要求:编写一个程序,其功能为:从键盘上输入一个浮点数(小数点后有三位数),然后分别输出该数的整数部分和小数部分。样例输入:123.456样例输出:123 456 [参考解答] #include &lt;stdio.h&gt; int main() { float x; int a, b; scanf("%
1966 0