二进制相关算法

来源:互联网 发布:yum 尝试其他镜像 编辑:程序博客网 时间:2024/05/18 00:30

1、求整数二进制中1的个数

解析:把一个整数减1,再和原整数做与运算,会把该整数最右边一个1变成0。那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作。

#include <stdio.h>int numof1(int num){int count = 0;while(num){++count;num = num&(num-1);}return count;}int main(){int num,count;printf("输入整数:\n");scanf("%d",&num);count = numof1(num);printf("整数二进制中1的个数为:\n%d\n",count);return 0;}


 

2、判断一个整数是不是2的整数次方。

分析:2的整数次方中只包含一个1,也就只需按照上面那道题的思路判断1个数是不是只有一个即可。

#include <stdio.h>bool is2power(int num){return (num&(num-1))==0;}int main(){int num;bool flag;printf("输入整数:\n");scanf("%d",&num);flag = is2power(num);if(flag)printf("该整数是2的整数次方!\n");elseprintf("该整数不是2的整数次方!\n");return 0;}


 

3、输入两个整数m、n,计算需要改变m的二进制中的多少位才能得到n。

分析:首先两个整数异或,之后计算异或后二进制1的个数即可。

#include <stdio.h>int numofchange1(int num1, int num2){int count = 0;int num = num1 ^ num2;while(num){++count;num = num&(num-1);}return count;}int main(){int num1,num2,count;printf("输入整数m:\n");scanf("%d",&num1);printf("输入整数n:\n");scanf("%d",&num2);count = numofchange1(num1,num2);printf("m需要改变%d位才能得到n!\n",count);return 0;}