目录
在c语言中我们可以使用一个函数来求这个数的二进制(补码),为了能够直观的看出代码是如何运行的,我们可以直接列出该数的二进制(补码)
例如: 13
补码(数字13):00000000000000000000000000001101(32位)
方法:十进制转换成二进制
首先我们先要知道十进制转换成二进制这个方法是怎么来的;
原理:
当我们将十进制数转换为二进制数时,可以使用取余和除法的原理。
首先,我们从输入的十进制数开始,不断将它除以2,得到商和余数。商表示当前位之前的部分,而余数则表示当前位的值(0或1)。重复这个过程,直到十进制数为0,即得到了所有位的二进制表示。
例如,假设我们要将十进制数13转换为二进制数:
十进制: 13
- 13 ÷ 2 = 6,余数为1,当前位的值是1。(个位)
- 6 ÷ 2 = 3,余数为0,当前位的值是0。(十位)
- 3 ÷ 2 = 1,余数为1,当前位的值是1。(百位)
- 1 ÷ 2 = 0,余数为1,当前位的值是1。(千位) 以此类推
由此可得 二进制:1101(每一次的余数 ,一定要记得是要倒着写)
从上述步骤可以看出,二进制数的最低位是最后一次除法的余数,而最高位是第一次除法的余数。因此,我们只需按照相反的顺序输出每个余数,即可得到十进制数的二进制表示。
所以,由此来输入一个数来求除该数的二进制后,将该数除于2后,看看余数是否等于1,则可以计算一个数二进制中1的个数,即可写出代码。
代码:
#include <stdio.h>
int count_bit_one(unsigned int a)
{
int count = 0;
while (a)
{
if (a % 2 == 1)
{
count++;
}
a = a /2;
}
return count;
}
int main()
{
int a;
printf("Enter a number:");
scanf("%d", &a);
int count = count_bit_one(a);
printf("count=%d\n", count);
return 0;
}
这里先声明了一个count_bit_one函数,之后再把输入的整数a代到函数中,再按上述的方法来求该数的二进制后,最后在使用if来求该数的二进制中1的个数。
需要注意的是,在count_bit_one函数中的参数声明(unsigned int n)中,unsigned int 的使用,若没有 unsigned int,则会导致以下错误:
例如:
输入 a= -2
在count_bit_one函数中,a%2相当与 - 2%2 而因此可以看出 - 2%2除不来,所以 - 2 的二进制中1的个数肯定为0。
如图所示:
这就是没有unsigned int的缺陷,若加上unsigned int
例如:
输入a= -2
代入count_bit_one函数中 a 就会变为2
一:利用除数的方法来求出该数二进制
- 2 ÷ 2 = 1,余数为0,当前位的值是0
- 1 ÷ 2 = 0,余数为1,当前位的值是1
- 1 ÷ 2 = 0,余数为1,当前位的值是1。
- ......以此类推下面余数都是1
二:利用最直观的方法来求出该数二进制
-2
10000000000000000000000000000010(原码)
按位取反得反码:
1111111111111111111111111111111111101(反码)
再+1得补码:
1111111111111111111111111111111111110(补码)
所以可以求出-2二进制中1的个数为31
如图所示:
该方法能够更加快速有效的得出一个数二进制中1的个数。