C语言位运算应用一:求一个数的二进制表示中1的个数
2017-07-26 11:11
239 查看
上一篇文章中,我们提到了位运算这个概念,今天我们试着使用位运算来统计一个数的二进制表示中1的个数。
首先是头文件:
#include<stdio.h>
#include<stdlib.h>
然后先写出主函数:
int main()
{
int num = 0;
printf("请输入一个整数:");
scanf("%d",&num);
printf("%d的二进制序列中有%d个1\n", num, BitCount(num));
system("pause");
return 0;
}
下一步是设计的个叫做BitCount的函数,传入一个整型,返回传入参数二进制表示中1的个数。
想要计算二进制中1的个数,必须用到位运算,上一篇文章中讲到左移(<<)和右移(>>)符号,a>>n表示把一个数的二进制序列最右边的n个位舍弃,再在最左边补上n个符号位,左移则是往相反的方向进行操作,但左移规定补的是零。而这一个函数要用到的令一个位运算是按位与(&),为的是判断二进制序列某个位是否为1。
我们要做的,是把每一个位提取出来,判断其若是1,则让初始值为0的计数器自加。整型的二进制序列有32位,因此要做32次判断,所以做一个for循环,循环内让二进制序列与1(为进制序列为1)按位与,若结果为1,则当前二进制序列最低位为1;若结果为0,则当前二进制序列最低位为0。若当前二进制序列最低位为1,则让初始值为0的计数器自加。每一次循环最后让二进制序列右移一位,32次提取之后便能由计数器统计出二进制序列中1的个数。
写出程序:
int BitCount (int num)
{
int t = 0;
int i = 0;
for(i=0; i<32; i++)
{
if((num&1) == 1)
t++;
num =(num>>1);
}
return t;
}
举个例子,现在有一个整数13,二进制为0000 0000 0000 0000 0000 0000 0000 1011,为了方便说明,在此直接采用1011来代替以上二进制序列。第一次循环中,序列为1011,与1相与,得到1,计数器自加后为1;第二次循环中,序列为0101,与1相与,得到1,计数器自加,为2;第三次循环中,序列为0010,与1相与,得到0,计数器不自加,仍为2;第四次循环中,序列为0001,与1相与,得到1,计数器自加后为3。之后的循环中序列最低位都为0,因此可以忽略,则在13的二进制序列当中有3个1,函数返回3。
看一下输出结果:
此外,这个函数对于负数依然有效,大家可以试着像我刚刚那样分析一下。
而现在的函数写的较为啰嗦,优化后得到:
int BitCount (int num)
{
int t = 0;
for(; num; num>>=1)
{
t +=num&1;
}
return t;
}
这题就完成了!大家有什么问题或者更好的想法,可以在给我下方留言喔!
首先是头文件:
#include<stdio.h>
#include<stdlib.h>
然后先写出主函数:
int main()
{
int num = 0;
printf("请输入一个整数:");
scanf("%d",&num);
printf("%d的二进制序列中有%d个1\n", num, BitCount(num));
system("pause");
return 0;
}
下一步是设计的个叫做BitCount的函数,传入一个整型,返回传入参数二进制表示中1的个数。
想要计算二进制中1的个数,必须用到位运算,上一篇文章中讲到左移(<<)和右移(>>)符号,a>>n表示把一个数的二进制序列最右边的n个位舍弃,再在最左边补上n个符号位,左移则是往相反的方向进行操作,但左移规定补的是零。而这一个函数要用到的令一个位运算是按位与(&),为的是判断二进制序列某个位是否为1。
我们要做的,是把每一个位提取出来,判断其若是1,则让初始值为0的计数器自加。整型的二进制序列有32位,因此要做32次判断,所以做一个for循环,循环内让二进制序列与1(为进制序列为1)按位与,若结果为1,则当前二进制序列最低位为1;若结果为0,则当前二进制序列最低位为0。若当前二进制序列最低位为1,则让初始值为0的计数器自加。每一次循环最后让二进制序列右移一位,32次提取之后便能由计数器统计出二进制序列中1的个数。
写出程序:
int BitCount (int num)
{
int t = 0;
int i = 0;
for(i=0; i<32; i++)
{
if((num&1) == 1)
t++;
num =(num>>1);
}
return t;
}
举个例子,现在有一个整数13,二进制为0000 0000 0000 0000 0000 0000 0000 1011,为了方便说明,在此直接采用1011来代替以上二进制序列。第一次循环中,序列为1011,与1相与,得到1,计数器自加后为1;第二次循环中,序列为0101,与1相与,得到1,计数器自加,为2;第三次循环中,序列为0010,与1相与,得到0,计数器不自加,仍为2;第四次循环中,序列为0001,与1相与,得到1,计数器自加后为3。之后的循环中序列最低位都为0,因此可以忽略,则在13的二进制序列当中有3个1,函数返回3。
看一下输出结果:
此外,这个函数对于负数依然有效,大家可以试着像我刚刚那样分析一下。
而现在的函数写的较为啰嗦,优化后得到:
int BitCount (int num)
{
int t = 0;
for(; num; num>>=1)
{
t +=num&1;
}
return t;
}
这题就完成了!大家有什么问题或者更好的想法,可以在给我下方留言喔!
相关文章推荐
- 位运算--一个整数的二进制表示中1的个数
- 位运算-Number of 1 Bits(求一个十进制数字,它的二进制表示中有多少个 1(bit))
- 位运算训练03—输入一个整数a,再输入两个整数p1,p2(p1,p2<32);将该整数的二进制表示方法中从右端开始的p1到p2位取反后输出
- 位运算训练04—输入一个整数a,再输入两个整数p(p<32),v(0|1);将该整数a的p位设置为v,输出修改后的该整数的二进制表示
- 巧妙计算一个数二进制表示法中1的位数
- 统计一个整型数组所有元素二进制表示中1的个数
- 给定一个正整数,找出与其二进制表示中1的个数相同,且大小最接近的那两个数
- 统计一个数的二进制表示时1的个数
- 交换一个整数二进制表示中的奇数位和偶数位
- 对于一个字节(8bit)的无符号整形变量,求二进制表示中“1”的个数,要求算法执行效率尽可能地高
- 位运算 —— 一个数二进制形式尾端为 0 的个数
- 73 [面试题]交换一个整数的二进制表示的奇偶位(swapOddEvenBits)
- 实现输出一个数字的二进制表示
- 2.2题目:输入一个整数a,再输入两个整数p1,p2(p1,p2<32),输出该整数的二进制表示方法中从右端开始的p1到p2位.
- Java算法总结:输入一个整数,求该整数的二进制表示中有多少个1
- 编程之美读书笔记:求一个字节(8bit)的无符号整型变量表示的二进制中1的个数
- 将一个整数在计算机中的二进制表示打印出来
- 算术运算的溢出行为 and 一个数内存中表示1的个数
- 金山笔试题 "写一个函数,对给定整数的二进制表示进行描述"
- 求逆转一个整数的二进制表示