C语言初阶必会的练习题(3)
放在最前面的1、不允许创建临时变量,交换两个整数的内容1.1、分析:见代码注释(a)方法 1(b)方法 2 1.2、结果展示方法 1 的 结果:方法 2 的 结果: 2、统计二进制中1的个数2.1、分析:见代码注释(a)方法 1(b)方法 2方法 2 的原理图 (c)方法 3方法 3 的原理图 2.2、结果展示方法 1 的 结果:方法 2 的 结果:方法 3 的 结果: 3、打印整数二进制的奇数位和偶数位3.1、分析:见代码注释3.2、结果展示展示 1展示 2 4、求两个数 二进制中不同位的个数4.1、分析:见代码注释4.2、结果展示 END
放在最前面的
?? 我的CSDN主页:OTWOL的主页,欢迎!!!????
??我的C语言初阶合集:C语言初阶合集,希望能帮到你!!!? ?
????创作不易,欢迎大家留言、点赞加收藏!!! ???
1、不允许创建临时变量,交换两个整数的内容
1.1、分析:见代码注释
(a)方法 1
//(方法 1):可以使用加减法,然后实现两个数字的互换 #include<stdio.h>//方法1int main(){//定义两个整型变量 a、bint a = 0;int b = 0;//输入scanf("%d %d", &a, &b);//定义一个整型变量 sumint sum = 0;//将 a + b的值赋值给 sumsum = a + b;//进行加减法操作,实现两个数字 的交换a = sum - a;//即 a = a + b - a = bb = sum - a ;//即 b = a + b - b = a//输出printf("%d %d\n", a, b);return 0;}
(b)方法 2
补充 ( ^ 按位异或操作符) 的使用:
对 按位异或操作符 ( ^ )还感到一头雾水的小伙伴们,快来点击下面的这篇超实用博客文章?,一起揭开它的神秘面纱吧!?✨
C语言中操作符详解(上)
方法2的原理图:
图片 1
图片 2
图片 3
图片 4
//(方法2):可以使用位操作符(^ -- 按位异或) #include<stdio.h>int main(){//定义三个整型变量 a、b、cint a = 0;int b = 0;int c = 0;//输入scanf("%d %d", &a, &b);//使用位操作符(^ -- 按位异或),实现两个数字 的交换c = a ^ b;b = c ^ b;a = c ^ a;//输出printf("%d %d\n", a, b);return 0;}
1.2、结果展示
输入两个数字: - 5 和 10
方法 1 的 结果:
方法 2 的 结果:
2、统计二进制中1的个数
描述:
写一个函数返回参数二进制中 1 的个数。
比如: 15
二进制位:0000 1111
有4 个 1
2.1、分析:见代码注释
(a)方法 1
//统计二进制中1的个数// //首先我们先把问题拆分成我们熟悉的问题//(1)要得到二进制数的每一位//(2)进行统计 二进制数字 1 的个数// //(1)要得到二进制数的每一位//类比 输出十进制的每一位是 // (i) % 10// (ii) / 10// //(2)进行统计 二进制数字 1 的个数//在得到每一位的数字时候,判断是否为 1//是 1 则 计数器加 1,反之,则不进入 if 语句 #include<stdio.h>//定义一个 NumberOf1 函数,返回类型是 int, //参数是 unsigned int(无符号整型) nint NumberOf1(unsigned int n){//定义一个计数器int count = 0;// while 循环while (n != 0){//判断 n % 2 的结果是否等于 1if ((n % 2) == 1){//如果是,则 count + 1count++;}// 将 n / 2 赋值给 nn = n / 2;}//返回 countreturn count;}int main(){//定义int n = 0;//输入scanf("%d", &n);//调用函数,用于输出数字的每一位,并统计 1 的个数int ret = NumberOf1(n);//输出printf("%d", ret);return 0;}
(b)方法 2
补充:
嘿小伙伴们!?? 如果有人对C语言里 按位与(&)操作符? 还感到一头雾水?,别急!? 点击下面的链接?,让我们一起复习一下,
把这些让人头疼的概念搞定吧!??
C语言中操作符详解(上)
方法 2 的原理图
#include<stdio.h>int NumberOf1(int n){//定义一个计数器int count = 0;//定义一个整型变量 iint i = 0;// for 循环 for (i = 0; i < 32; i++){// if 条件判断语句// 判断是条件是 (n >> i) -- n 右移 i 位// 与 1 进行相与(对应的二进制序列 有 0 则是 0,两个同时为 1 才为 1)// 的结果是否 等于 1if (((n >> i) & 1) == 1){//如果是,则 count+1count++;}}//返回 countreturn count;}int main(){//定义int n = 0;//输入scanf("%d", &n);//调用函数,并统计 1 的个数int ret = NumberOf1(n);//输出printf("%d", ret);return 0;}
(c)方法 3
方法 3 的原理图
int NumberOf1(int n){//定义一个计数器int count = 0;// while 循环while (n != 0){//进入循环即 n != 0,则 count + 1count++;// 将 n 和 (n - 1) 进行 相与(对应的二进制序列 有0 则是 0,两个同时为 1 才为1)// 并将结果 赋值给 nn = n & (n - 1);}//返回 countreturn count;}int main(){//定义int n = 0;//输入scanf("%d", &n);//调用函数,并统计 1 的个数int ret = NumberOf1(n);//输出printf("%d", ret);return 0;}
2.2、结果展示
方法 1 的 结果:
方法 2 的 结果:
方法 3 的 结果:
3、打印整数二进制的奇数位和偶数位
描述:
获取一个整数二进制序列中所有的偶数位和奇数位,
分别打印出二进制序列
3.1、分析:见代码注释
思路展示:void Print(int n){//定义一个整型变量 iint i = 0;//打印提示信息printf("奇数位:");// for 循环 for (i = 30; i >= 0; i -= 2){printf("%d ", (n >> i) & 1);}//打印提示信息printf("\n偶数位:");// for 循环 for (i = 31; i >= 1; i -= 2){printf("%d ", (n >> i) & 1);}}int main(){//定义int n = 0;//输入scanf("%d", &n);//调用函数,用于打印整数二进制的奇数位和偶数位Print(n);return 0;}
3.2、结果展示
展示 1
输入数字 1
数字1 在32位机器上的二进制序列
VS输出结果图片展示
展示 2
输入数字 10
数字10 在32位机器上的二进制序列
VS输出结果图片展示
4、求两个数 二进制中不同位的个数
描述:
编程实现:
两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
输入例子: 1999 2299
输出例子:7
4.1、分析:见代码注释
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>int main(){//定义两个整型变量 a、bint a = 0;int b = 0;//输入scanf("%d %d", &a, &b);//定义一个整型变量 iint i = 0;//定义一个整型变量 count,用作计数器int count = 0;// for 循环for (i = 0; i < 32; i++){// if 条件语句// 判断条件是 a 和 b 的每一位(右移 i 位操作)分别与 1 进行 // 按位与(对应的二进制序列,数字同时为 1才为 1,有 0 则为 0)// 即得到 a 和 b 的二进制序列的每一位进行 一 一 比较if (((a >> i) & 1) != ((b >> i) & 1)){//计数器 count 加 1count++;}}//输出printf("%d\n", count);return 0;}
4.2、结果展示
输入例子: 1999 2299
输出例子: 7
END
每天都在学习的路上!
On The Way Of Learning
“亲爱的读者们,文章到这里就结束啦?。在阅读过程中有没有遇到什么疑问等等❓欢迎在评论区留言告诉我哦,期待与你的互动交流?!”