当前位置:首页 » 《关于电脑》 » 正文

C语言初阶必会的练习题(3)之位操作符(^ 、&、>>等)的应用

10 人参与  2024年11月14日 10:41  分类 : 《关于电脑》  评论

点击全文阅读


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

“亲爱的读者们,文章到这里就结束啦?。在阅读过程中有没有遇到什么疑问等等❓欢迎在评论区留言告诉我哦,期待与你的互动交流?!”


点击全文阅读


本文链接:http://zhangshiyu.com/post/185879.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1