返回参数二进制中1的个数
2018-03-29 20:11
190 查看
方法1: 辗转相除法
比如 :十进制数1234,想知道十进制中1的个数。
1234 --------num num%10==4 num=num/10;
123 --------num num%10==3 num=num/10;
12 --------num num%10==2 num=num/10;
1 --------num num%10==1 count++;
对应到二进制数中如下:int main()
{
int num;
int count=0;
printf("Enter num:");
scanf("%d", &num);
while (num)
{
if (num % 2 == 1)
{
count++;
}
num = num / 2;
}
printf("count=%d\n", count);当num=0时,二进制数中没有1,所以直接输出count=0;
当num1=0时,执行循环;
但是: 该循环不能用于负数;比如当-1参与循环,-1%2!=1,count=0;
-1/10==0,不执行循环。输出count=0,但是实际上-1的二进制中有32个1;
方法2: 移位法int main()
{
int num;
int i;
int count=0;
printf("Enter num:");
scanf("%d", &num);
for (i = 0; i < 32; i++)
{
if ((num & 1) == 1)
{
count++;
}
num = num >> 1;
}
printf("count=%d\n", count);
system("pause");
return 0;
}int型(4个字节,32个比特位)二进制中1: 00000000 00000000 00000000 00000001
&:有0为0,全1为1;
所以num&1之后,二进制前31为全为0,最后一位若为1,num&1==1;否则num&1==0;
每次判断之后右移一位,一共判断32次。
但是: 循环32次,效率很慢。
方法3: 按位与法int main()
{
int num;
int i;
int count=0;
printf("Enter num:");
scanf("%d", &num);
while (num)
{
num = num&(num - 1);
count++;
}
printf("count=%d\n", count);
system("pause");
return 0;
}比如:000000000 000000000 00000000 00001111 --num
000000000 000000000 00000000 00001110 --num-1
000000000 000000000 00000000 00001110 --num num&(num-1)
000000000 000000000 00000000 00001101 --num-1
000000000 000000000 00000000 00001100 --num num&(num-1)
000000000 000000000 00000000 00001011 --num-1
000000000 000000000 00000000 00001000 --num num&(num-1)
000000000 000000000 00000000 00000111 --num-1
000000000 000000000 00000000 00000000 --num num&(num-1)
循环四次,输出4:;
当num=0 时循环结束,所以大大减少了循环的次数。
比如 :十进制数1234,想知道十进制中1的个数。
1234 --------num num%10==4 num=num/10;
123 --------num num%10==3 num=num/10;
12 --------num num%10==2 num=num/10;
1 --------num num%10==1 count++;
对应到二进制数中如下:int main()
{
int num;
int count=0;
printf("Enter num:");
scanf("%d", &num);
while (num)
{
if (num % 2 == 1)
{
count++;
}
num = num / 2;
}
printf("count=%d\n", count);当num=0时,二进制数中没有1,所以直接输出count=0;
当num1=0时,执行循环;
但是: 该循环不能用于负数;比如当-1参与循环,-1%2!=1,count=0;
-1/10==0,不执行循环。输出count=0,但是实际上-1的二进制中有32个1;
方法2: 移位法int main()
{
int num;
int i;
int count=0;
printf("Enter num:");
scanf("%d", &num);
for (i = 0; i < 32; i++)
{
if ((num & 1) == 1)
{
count++;
}
num = num >> 1;
}
printf("count=%d\n", count);
system("pause");
return 0;
}int型(4个字节,32个比特位)二进制中1: 00000000 00000000 00000000 00000001
&:有0为0,全1为1;
所以num&1之后,二进制前31为全为0,最后一位若为1,num&1==1;否则num&1==0;
每次判断之后右移一位,一共判断32次。
但是: 循环32次,效率很慢。
方法3: 按位与法int main()
{
int num;
int i;
int count=0;
printf("Enter num:");
scanf("%d", &num);
while (num)
{
num = num&(num - 1);
count++;
}
printf("count=%d\n", count);
system("pause");
return 0;
}比如:000000000 000000000 00000000 00001111 --num
000000000 000000000 00000000 00001110 --num-1
000000000 000000000 00000000 00001110 --num num&(num-1)
000000000 000000000 00000000 00001101 --num-1
000000000 000000000 00000000 00001100 --num num&(num-1)
000000000 000000000 00000000 00001011 --num-1
000000000 000000000 00000000 00001000 --num num&(num-1)
000000000 000000000 00000000 00000111 --num-1
000000000 000000000 00000000 00000000 --num num&(num-1)
循环四次,输出4:;
当num=0 时循环结束,所以大大减少了循环的次数。
相关文章推荐
- 【c语言】 写一个函数返回参数二进制中 1 的个数
- 写一个函数返回参数二进制中1的个数
- 一个函数返回参数二进制中 1 的个数
- [置顶] 写一个函数返回参数二进制中1的个数
- 用一个函数返回参数二进制中1的个数
- 总结:写一个函数返回参数二进制中 1 的个数
- 写一个函数返回参数二进制中 1 的个数
- C实现 一个函数返回参数二进制中1的个数(面试题)
- 返回参数二进制中 1 的个数
- 【c语言】 写一个函数返回参数二进制中 1 的个数
- 返回参数二进制中1的个数、输出二进制序列
- 求十个数中的最大的数,写一个函数返回一个参数中二进制形式中1的个数。
- 写一个函数返回参数二进制中 1 的个数
- 返回参数二进制为1的个数
- 写一个函数返回参数二进制中1的个数
- 写一个函数返回参数二进制中 1 的个数
- 写一个函数返回参数二进制中1的个数
- 写一个函数返回参数二进制中 1 的个数,获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列。
- 返回参数的二进制中 1 的个数
- 写一个函数返回参数二进制中 1 的个数 比如: 15 0000 1111 4 个 1 程序原型: int count_one_bits(unsigned int value) { //