C语言操作符例题

这里写目录标题

  • 例题一
    • 题目解析
  • 例题二
    • 题目解析
  • 例题三
    • 方法一
    • 方法二
    • 方法三
  • 例题四
  • 例题五

感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接
🐒🐒🐒 个人主页
🥸🥸🥸 C语言
🐿️🐿️🐿️ C语言例题
🐣🐓🏀 python

例题一

下面代码的结果是:( )

#include <stdio.h>
int main()
{int a, b, c;a = 5;c = ++a;b = ++c, c++, ++a, a++;b += a++ + c;printf("a = %d b = %d c = %d\n:", a, b, c);return 0;
}

A.a = 8 b = 23 c = 8
B.a = 9 b = 23 c = 8
C.a = 9 b = 25 c = 8
D.a = 9 b = 24 c = 8

答案 B

题目解析

c=++a是先执行++a,也就是a=a+1=6(注意这里是永久改变a的值),然后再执行c=a=6
b=++c,c++,++a,a++这里要注意对于b我们是只算b=++c,所以先执行c=c+1=7
b=c=7,然后再执行后面的c++,++a,a++(后面还是会执行的,只不过和b就没关系了),最终c=8.a=8
b+=a++ +c先变成b=b+a++ +c再执行a=a+1=9,b=b+a+c=7+8+8=23
最终a=9 b=23 c=8

例题二

不允许创建临时变量,交换两个整数的内容

题目解析

我们需要用到按位异或的方法去解决,按位异或在之前我有写到操作符详解上(非常详细)

#include <stdio.h>
int main()
{int a = 10;int b = 20;printf("交换前:a = %d b = %d\n", a,b);a = a^b;b = a^b;a = a^b;printf("交换后:a = %d b = %d\n", a,b);return 0;
}

按位异或就是相同为0不同为1,并且满足数学的交换规律
对于
一式a=a^b ,二式b=a^b, 三式a=a^b
我们将一式带入二式,b=a^ b^b,由于b ^b=1,那么最后b=a
而三式a=a^b其实就是a=a ^b ^a,其中a ^b是一式带入的,利用交换律我们就可以变成a=a ^a ^b,所以最后a=b

例题三

统计二进制中1的个数
代码解析:

方法一

*/
int NumberOf1(int n)
{int count = 0;while(n){if(n%2==1)count++;n = n/2;//每次除2然后循环判断}return count;
}
/*

上述方法缺陷:进行了大量的取模以及除法运算,取模和除法运算的效率本来就比较低。
我们看看另外一个思路
一个int类型的数据,对应的二进制一共有32个比特位,可以采用位运算的方式一位一位的检测,具体如下

方法二


*/
int NumberOf1(unsigned int n)
{int count = 0;int i = 0;for(i=0; i<32; i++){if(((n>>i)&1) == 1)count++;}return count;
}int NumberOf1(int n ) {int j=0;for(int i=1;i<=32;i++){if(n%2)//如果n%2为1就代表个位是1(这里不用判断十位百位){n=n>>1;j++;}else(如果个位是0就直接右移)n=n>>1;}printf("%d",j);return j;
}/*优点:用位操作代替取模和除法运算,效率稍微比较高缺陷:不论是什么数据,循环都要执行32次

方法三

思路:采用相邻的两个数据进行按位与运算
举例:‬
第一次循环:n=9999  
n=n&(n-1)=9999&9998=9998
(10 0111 0000 1111)
(10 0111 0000 1110) 
=(10 0111 0000 1110) 
第二次循环:n=9998 n=n&(n-1)=9998&9997= 9996(10 0111 0000 1110) (10 0111 0000 1101) =(10 0111 0000 1100) 
第三次循环:n=9996 
n=n&(n-1)=9996&9995= 9992
(10 0111 0000 1100) 
(10 0111 0000 1011) 
=(10 0111 0000 1000) 
第四次循环:n=9992   
n=n&(n-1)=9992&9991= 9984
(10 0111 0000 1000) 
(10 0111 0000 0111)
=(10 0111 0000 0000)
第五次循环:n=9984
n=n&(n-1)=9984&9983= 9728
(10 0111 0000 0000)
(10 0110 1111 1111)
=(10 0110 0000 0000)
第六次循环:n=9728   
n=n&(n-1)=9728&9727= 9216
(10 0110 0000 0000)
(10 0101 1111 1111)
=(10 0100 0000 0000)
第七次循环:n=9216   
n=n&(n-1)=9216&9215= 8192
(10 0100 0000 0000)
(10 0011 1111 1111)
=(10 0000 0000 0000)
第八次循环:n=8192   
n=n&(n-1)=8192&8191= 0
(10 0000 0000 0000)
(01 1111 1111 1111)
=(00 0000 0000 0000)可以观察到:此种方式,数据的二进制比特位中有几个1,循环就循环几次
而且中间采用了位运算,处理起来比较高效
*/
int NumberOf1(int n)
{int count = 0;while(n){n = n&(n-1);count++;}return count;
}

例题四

打印整数二进制的奇数位和偶数位
代码解析:

/*
思路:
1. 提取所有的奇数位,如果该位是1,输出1,是0则输出0
2. 以同样的方式提取偶数位置检测num中某一位是0还是1的方式:1. 将num向右移动i位2. 将移完位之后的结果与1按位与,如果:结果是0,则第i个比特位是0结果是非0,则第i个比特位是1
*/
void Printbit(int num)
{for(int i=31; i>=1; i-=2){printf("%d ", (num>>i)&1);}printf("\n");for(int i=30; i>=0; i-=2){printf("%d ", (num>>i)&1);}printf("\n");
}

例题五

求两个数二进制中不同位的个数

#include <stdio.h>int main() {int a, b,sum=0;scanf("%d %d",&a,&b);for(int i=0;i<32;i++){int c=a>>i; int d=b>>i;if((c&1)==(d&1))判断个位是否相同;elsesum++;}printf("%d",sum);return 0;
}
/*
思路:
1. 先将m和n进行按位异或,此时m和n相同的二进制比特位清零,不同的二进制比特位为1
2. 统计异或完成后结果的二进制比特位中有多少个1即可
*/
#include <stdio.h>
int calc_diff_bit(int m, int n)
{int tmp = m^n;//找出相同的位int count = 0;while(tmp){tmp = tmp&(tmp-1);//和上一题的方法三相同count++;}return count;
}
int main()
{int m,n;while(scanf("%d %d", &m, &n) == 2){printf("%d\n", calc_diff_bit(m, n));}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/160503.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能指针(Newbie Note)

智能指针专题 1.普通指针的问题2.智能指针是什么什么是所有权 3.智能指针三个好处&#xff1a;4.C11提供的智能指针4.1 shared_ptr&#xff08;共享所有权指针&#xff09;4.1.1 分配内存4.1.2 成员函数4.1.3 计数情况汇总&#xff1a;4.1.4 示例代码(计数)4.1.5 示例代码(rese…

Java深拷贝与浅拷贝技术解析及实例演示

摘要&#xff1a;本文将详细介绍Java中的深拷贝和浅拷贝概念&#xff0c;通过分析源码和举例说明&#xff0c;帮助读者更好地理解这两种拷贝方式的区别及应用场景。 一、深拷贝与浅拷贝的概念 深拷贝&#xff1a;复制一个对象后&#xff0c;无论是基本数据类型还是引用类型&…

多柱汉诺塔问题

k柱汉诺塔 题目描述 汉诺塔&#xff08;Hanoi Tower&#xff09;&#xff0c;又称河内塔。 传说大梵天创造世界的时候做了三根金刚石柱子&#xff0c;按左、中、右排序。大梵天在左侧的柱子上&#xff0c;从下往上按照大小顺序摞着64片黄金圆盘&#xff0c;越靠下的圆盘越大。…

个人博客项目 - 测试报告

文章目录 一、项目背景二、测试报告功能测试1.编写测试用例2.登录测试3.编写文章测试4.查看文章测试5.删除文章测试7.注销登录测试 自动化测试性能测试1.VUG2.进行场景设计3.生成性能测试报告 总结 本文开始 一、项目背景 通过学习测试相关的知识&#xff0c;动手实践并测试一…

2023 年 亚太赛 APMCM ABC题 国际大学生数学建模挑战赛 |数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 以五一杯 A题为例子&#xff0c;以下是咱们做的一些想法呀&am…

【Vue】自定义指令

自定义指令 自定义指令就是自己定义的指令&#xff0c;是对 DOM 元素进行底层操作封装 ,程序化地控制 DOM&#xff0c;拓展额外的功能 全局定义 Vue.directive(指令名字, definition) 指令名&#xff1a;不包括v-前缀&#xff0c;使用时候包括v-&#xff0c;v-指令名defini…

CUTLASS 1.3.3中的 Volta884_h884gemm

CUTLASS 是 CUDA C 模板抽象的集合&#xff0c;用于在 CUDA 内的所有级别和规模上实现高性能矩阵-矩阵乘法 (GEMM) 和相关计算。它采用了类似于 cuBLAS 和 cuDNN 中实现的分层分解和数据移动策略。 CUTLASS 最新版本为3.3&#xff0c;相比1.3.3变动较大。然而重温一下1.3.3仍然…

生产问题 Recv-Q101

生产上服务端口 Recv-Q101 新请求到服务器的失败&#xff0c;幸好及时发现&#xff0c;通过重启服务之后得到解决&#xff0c;具体原因等待排查 目前觉得的原因是&#xff1a;某些请求暂用时间比较久

Linux超简单部署个人博客

1 安装halo 1.1 切换到超级用户 sudo -i 1.2 新建halo文件夹 mkdir ~/halo && cd ~/halo 1.3 编辑docker-compose.yml文件 vim ~/halo/docker-compose.yml 英文输入法下&#xff0c;按 i version: "3"services:halo:image: halohub/halo:2.10container_…

2017年全国硕士研究生入学统一考试管理类专业学位联考数学试题——解析版

文章目录 2017 级考研管理类联考数学真题解析一、问题求解&#xff08;本大题共 5 小题&#xff0c;每小题 3 分&#xff0c;共 45 分&#xff09;下列每题给出 5 个选项中&#xff0c;只有一个是符合要求的&#xff0c;请在答题卡上将所选择的字母涂黑。真题&#xff08;2017-…

Python 提高篇学习笔记(一):深拷贝和浅拷贝

文章目录 一、什么是对象的引用二、深拷贝和浅拷贝2.1 浅拷贝(Shallow Copy)2.2 深拷贝(Deep Copy)2.3 copy.copy和copy.deepcopy的区别 一、什么是对象的引用 在 Python 中&#xff0c;对象的引用是指变量指向内存中某个对象的地址或标识符。当你创建一个新的对象(比如一个整…

[技术杂谈]计算机系统硬件类名称

在各种编程语言都可以见到利用WMI查询计算机硬件信息&#xff0c;因此知道有哪些计算机硬件名称非常有必要&#xff0c;下面列举了所有计算机硬件名称可以查询。 本文内容 冷却设备类输入设备类大容量存储类主板、控制器和端口类 显示另外 6 个 计算机系统硬件类别将表示硬…

git修改远程分支名称

先拉取old_branch最新代码到本地 git checkout old_branchgit pull origin old_branch本地修改后并推送 git branch -m old_branch new_branch # 修改分支名称git push --delete origin old_branch # 删除在远程的老分支推送新分支 git push origin new_branch本地分支与远…

除自身以外数组的乘积[中等]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给你一个整数数组nums&#xff0c;返回数组answer&#xff0c;其中answer[i]等于nums中除nums[i]之外其余各元素的乘积。题目数据保证数组nums之中任意元素的全部前缀元素和后缀的乘积都在32位整数范围内。请不要使用除法&#xff0…

【Qt开发流程】之富文本处理

描述 Scribe框架提供了一组类&#xff0c;用于读取和操作结构化的富文本文档。与Qt中以前的富文本支持不同&#xff0c;新的类集中在QTextDocument类上&#xff0c;而不是原始文本信息。这使开发者能够创建和修改结构化的富文本文档&#xff0c;而不必准备中间标记格式的内容。…

【数据结构】A : A DS图_传递信息

A : A DS图_传递信息 Description 小明在和他的小伙伴们玩传消息游戏&#xff0c;游戏规则如下&#xff1a; 有n名玩家&#xff0c;所有玩家编号分别为0~n-1&#xff0c;其中小明编号为0&#xff1b;每个玩家都有固定的若干个可传信息的其他玩家(也可能没有)。传消息的关系是…

busybox制作根文件系统2

上篇内容使用busybox制作好了根文件系统&#xff0c;接下来需要进行一些测试和功能的完善&#xff01; 根文件系统的测试 测试根文件系统的时候不是直接烧写到EMMC里面&#xff0c;这样测试效率太低了&#xff0c;Ubuntu的rootfs目录已经保存了根文件系统&#xff0c;只需要在…

向量数据库,展望AGI时代

无论是向量数据库&#xff0c;还是大模型&#xff0c;归根结底&#xff0c;大家在追捧它时的心态&#xff0c;焦虑大于需求。 向量数据库的热潮&#xff0c;在一定程度上“外化”了人们的焦虑。 但这并不能否定向量数据库的实际价值&#xff0c;甚至更长远来看&#xff0c;向…

【C++】linux下的gdb程序调试

目录 【C】Linux 下的 GDB 程序调试1. 安装 GDB2. 编译程序3. 启动 GDB4. 设置断点5. 执行程序6. 调试命令7. 调试崩溃8. 结束调试 【C】Linux 下的 GDB 程序调试 在开发 C 程序时&#xff0c;出现 bug 是常见的。调试是找出程序错误的关键步骤之一。在 Linux 环境下&#xff…

RedisTemplate使用详解

RedisTemplate介绍StringRedisTemplate介绍RedisConnectionFactory介绍RedisConnectionFactory源码解析 RedisOperations介绍RedisOperations源码解析 RedisTemplate使用连接池配置RedisTemplate连接池连接池配置 RedisTemplate应用场景RedisTemplate主要特点RedisTemplate使用…