求二进制序列中1的个数及奇偶序列+输出整数的每一位+两个数中多少个bit位不同
来源:互联网 发布:ssh弱算法支持 漏洞 编辑:程序博客网 时间:2024/05/19 12:16
题目一:求一个整数的二进制序列中1的个数
分析:首先,我们知道数在内存中是以补码得形式储存的,而正数的原码补码反码都相同。
做法一:
int main(){ int count = 0; int num = 0; printf("输入一个数:"); scanf("%d", &num); while (num) { if (num % 2 == 1) { count++; } num = num / 2; } printf("1的个数为%d", count); system("pause"); return 0;}//可以测试正数,负数无法测试
先来看结果:
如果输入一个负数呢?
显然结果是错误的,所以这种做法是有缺陷的对于负数无法测试。
给出第二种思路:使用右移操作符将每一位都移到最右边在与1按位与,结果为1说明原位为1;结果为0说明原位为0;
int main(){ int i = 0; int num = 0, count = 0; printf("请输入一个数:"); scanf("%d", &num); for (i = 0; i < 32; i++) { if ((num >> i) & 1 == 1) { count++; } } printf("1的个数:%d", count); system("pause"); return 0;}
看结果:
这里用-1测试,我们都知道-1 的补码是32个1,结果正确。
思考这种方式是不是最好的呢?这种方式每次都要循环32次,效率很低。
在这里给出一种最简单的方式:
int main(){ int i = 0; int num = 0, count = 0; printf("请输入一个数:"); scanf("%d", &num); while (num) { count++; num = num&(num - 1);//一个数与他下一个数按位与,可以去掉最右边的1,此时一个二进制数中有几个1,就循环几次,最坏情况是循环32次。 } printf("1的个数为:%d", count); system("pause");return 0;}
结果:
分析:将这个数和他下一个数按位与,可以每次将最右面的1去掉,即就是说一个数二进制序列中有几个1,就循环几次,效率非常高,最坏情况也只是循环32次。
题目二:求出一个数的奇偶序列
分析:很容易想到这个题可以先将每一位取出来存入一个数组,然后将奇数位输出,偶数位输出就好。
直接给出代码:
int main(){ int a[32] = { 0 }; int num = 0; int i = 0; printf("请输入一个数"); scanf("%d", &num); for (i = 0; i < 32; i++) { a[i] = num & 1; num = num >> 1; } printf("奇数序列"); for (i = 31; i >= 0; i -= 2) { printf("%d", a[i]); } printf("\n"); printf("偶数序列"); for (i = 30; i >= 0; i -= 2) { printf("%d", a[i]); } system("pause"); return 0;}
结果:
这里测试时给出了一个比较特别的数字,可以用计算器自己定义一个序列然后进行测试。
思考如果这个题要求不使用数组来存放数组该如何做呢。
给出代码:
int main() { int num = 0; int i = 0; printf("请输入一个数:"); scanf("%d", &num); for(i=31; i>0; i-=2) { printf("%d ", (num>>i)&1); } printf("\n"); for(i=30; i>=0; i-=2) { printf("%d ", (num>>i)&1); } system("pause"); return 0; }
显然这种方法更加简单,不需要借助数组,占用空间,我们只需要进行输出,这里给出测试结果,这里是用-1来测试的(32个1,即奇偶数列都为1,结果正确 )
题目三:要求输出一个整数的每一位
分析:同样这道题我们也可以使用数组来存放这个整数的每一位数,然后输出每一位(注意:存放时是从右向左存放,那么输出时应该将数组逆序输出)
int main(){ int num = 0; int count = 0; int i = 0, tmp = 0; int a[100] = { 0 }; printf("请输入一个数"); scanf("%d", &num); tmp = num; while (tmp) { count++;//整数的位数 tmp = tmp / 10; } for (i = 0; i < count; i++) { a[i] = num % 10; num = num / 10; } for (i = count-1; i >= 0; i--) { printf("%d ",a[i]); } system("pause");return 0;}
如果不使用数组,只执行打印输出操作。
void Print(int n){ if (n > 9) { Print(n / 10);//递归打印每一个数,将每一个数拆开并打印 } printf("%d ", n % 10);}int main(){ int num = 0; printf("请输入一个数:"); scanf("%d", &num); Print(num); system("pause");
题目四:求出两个数的二进制序列中有几个bit位不同
int main(){ int m = 0, n = 0; int i = 0; int count = 0; printf("请输入两个数"); scanf("%d%d", &m, &n); i = m^n; while (i) { i=i&(i - 1); count++; } printf("%d", count); system("pause"); return 0;}
分析:两个数现进行按位异或得到一个二进制序列,两个数的某位相同则得到的序列中该位为0,某位相异则得到的二进制序列中该位为1,此时问题就转化为题目一,求出该二进制数列中1的个数即可。
- 求二进制序列中1的个数及奇偶序列+输出整数的每一位+两个数中多少个bit位不同
- Pace 6 (1.写一个函数返回参数二进制中 1 的个数;2..获取一个数二进制序列中所有的偶数位和奇数位;3. 输出一个整数的每一位;4.两个int整数的二进制表达中,有多少个位不同
- 求两个数的二进制中有多少个不同的bit位
- 【算法】求两个数中,bit位不同的个数
- 求两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同
- 求出两个int(32位)整数m和n的二进制表达中,有多少bit位不同
- 求两个整型二进制中有多少个不同位
- 两个二进制中不同位的个数
- 1.编程实现: 两个int(32位)整数m和n的二进制表达中, 有多少个位(bit)不同? 输入例子: 1999 2299 输出例子:7
- 4.编程实现: 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同? 输入例子: 1999 2299 输出例子:7
- 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同? 输入例子: 1999 2299 输出例子:7
- 一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列。
- 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同
- 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同
- 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同
- 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同
- 编程实现: 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
- 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
- java实现MD5加密
- zookeeper概述(1)
- JavaScript基于时间的动画算法
- Android 4.4相机代码分析
- Python中代码的一些基本知识
- 求二进制序列中1的个数及奇偶序列+输出整数的每一位+两个数中多少个bit位不同
- css3实现图片木桶布局
- 百度地图API ajax异步获取数据库信息 页面显示多点标注和标注框
- Ubuntu 17.10 Android Studio 无法打开虚拟机问题
- 【Java性能】你需要知道的:Java字符串连接使用"+"和StringBuilder性能比较
- Retrofit 结合rxjava框架用法
- JDBC基本概念
- 蓝桥杯 基础练习 特殊回文数/回文数
- [译] ubuntu install tomcat maven