C语言(操作符)1

                     Hi~!这里是奋斗的小羊,很荣幸各位能阅读我的文章,诚请评论指点,关注+收藏,欢迎欢迎~~     

                        💥个人主页:小羊在奋斗

                        💥所属专栏:C语言   

        本系列文章为个人学习笔记,在这里撰写成文一为巩固知识,二为同样是初学者的学友展示一些我的学习过程及心得。文笔、排版拙劣,望见谅。 

                                1、操作符的分类

                                2、原码、反码、补码

                                3、移位操作符

                                4、位操作符

1、操作符的分类

        (1)算术操作符:+、-、*、/、%

        (2)移位操作符:<<、>>

        (3)位操作符:&、|、^、~

        (4)赋值操作符:=、+=、-=、*=、/=、%=、<<=、>>=、&=、|=、^=

        (5)单目操作符:!、++、--、&、*、+、-、~、sizeof、(类型)

        (6)关系操作符:>、>=、<、<=、==、!=

        (7)逻辑操作符:&&、||

        (8)条件操作符:?:

        (9)逗号表达式:,

        (10)下标引用:[ ]

        (11)函数调用:()

        (12)结构体成员访问:. 、->

2、原码、反码、补码

        整数的二进制表示方法有三种,即原码、反码和补码,有符号整数的三种表示方法均由符号位数值位组成,二进制序列中,最高位的1位是符号位,后面的都是数值位。符号位0表示正,1表示负

        正整数和无符号整数的原码、反码和补码都相同,负整数的三种表示方法各有不同。

        原码:直接将数值按照正负数的形式翻译成二进制得到的就是原码;

        反码:将原码的符号位不变,数值位按位取反就是反码;

        补码:反码+1得到补码。

        原码转换补码、补码转换原码都是取反+1

        对整型来说,数据在内存中存放的是补码。为什么呢?

        在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码可以将符号位和数值位统一处理。同时,加法和减法也可以统一处理,因为CPU只有加法器。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

        比如,我们计算1-1,因为CPU只有加法器,所以我们用1+(-1)的形式计算:

3、移位操作符

        (1)移动的是存储在内存中二进制位(补码);

        (2)移位操作符的操作数只能是整数;

       3.1 左移操作符:<<        

        移位规则:左边抛弃,右边补0 

        将10左移一位:

        将-5左移一位:

 

        规律:左移一位有乘2的效果;同样的,左移n位等于乘以2的n次方

        3.2 右移操作符:>>

        移位规则:(1)逻辑右移:左边补0;右边丢弃

                          (2)算术右移:左边补原该值的符号位,右边丢弃

        逻辑右移或算术右移是取决于编译器的,通常采用的都是算术右移

        将10右移一位: 

        

将-4右移一位:

        规律:右移一位有除2的效果,同样的,右移n位等于除以2的n次方。 

         注意:对于移位操作符,不要移动负数位,这个是未定义的。

4、位操作符

        注意:它们的操作数也必须都是整数。

        &:按位与(有0则为0

        因为3与-6的结果为正数,补码和原码相同,所以这里直接用了补码计算。

        |:按位或(有1则为1) 

        

        ^:按位异或(相同为0,相异为1) 

         ~:按位取反(单目操作符

例题1: 不能创建临时变量,实现两个整数的交换

        方法一:要实现两个整数的交换,我们首先会想到创建一个临时变量来解决。

        这无疑是一个最简单高效的方法。但题目明确说明了不能创建临时变量,那我们就要另想办法了。 

        方法二:既然不能创建临时变量,那我们只能对这两个数本身下手了。

        大家觉得上面这个办法怎么样?我们按照题目要求完成了任务。

        但是,这个办法是受限的。如果两个整数太大的话相加会溢出,那有没有完美的办法呢?

既然这样问,那答案肯定是有的,办法就在我们上面新学到的知识中。

        方法三:使用异或操作符

        不知道你第一次看到这个代码的时候有没有懵逼呢?反正我是挺惊讶的。那接下来我们就来分析上面的代码具体是怎么实现的。

         首先我们知道,按位异或操作符的规则是:相同为0,想异为1。因为4^4=0,所以a^a=0;因为4^0=4,所以a^0=a;因为4^4^5=5,经过计算4^5^4=5,所以异或操作符是支持交换律的。

        因为异或操作符不存在进位,所以不会发生溢出。 需要说明的是,这只是我们为了加深对异或操作符的理解而想出的一个题目,未来我们交换两个整数还是用创建临时变量的方法更好,可读性高,效率高。

 例题2:编写代码求一个整数存储在内存中的二进制中1的个数

        方法一:我们可以想办法拿到二进制的每一位,然后统计1的个数。

        说起拿到二进制的每一位,就想到了我们之前的一个例题,其中有拿到十进制数的每一位的方法,通过模10除10即可;同样的,我们也可以通过模2除2来得到二进制数的每一位。

        10的二进制表示为1010,有2个1。 看似我们完成了要求,但当我们输入负数的时候,结果却是错的。原因在于形参是有符号的整型,负数取模的结果不会为1,很显然这个方法对负数不起作用。我们把形参定义为无符号的整型,当负数传过来的时候,我们把它当做无符号的整型看待,因为无符号整型的原码、反码、补码都相同,这时候就把这个无符号整形看作一个很大的正数,从而解决问题。

        方法二:对整数二进制的最低位与1再向右移位,循环执行。这个方法不用关心是不是有符号无符号数的问题。

        我们利用按位与的特点,如果二进制最低位是1,按位与1得到1;如果二进制最低位是0,按位与1得到0;再循环执行,我们就能得到二进制中1的个数。

        这个方法也是可行的, 但它还不是最优的。

        方法三:其实有一个专门用来计算一个数的二进制表示中有多少个1的算法:n &= (n - 1)

         这个算法牛逼的地方在于,n &= (n - 1) 这个式子执行一次,二进制表示的数就会少一个1,执行多少次,就有多少个1;也就是说输入的数有几个1就执行几次,效率很高

        这种算法除非见过,一般人还真想不出来,不过我们记住就行,不必太执着其中的原理。

例题3:判断一个数是不是2的次方数

        2的次方数,有没有什么特点呢?通过上面我们了解了二进制,很容易就能想到,2的次方数二进制表示中只有一个1,那我们利用上面方法三中的代码判断结果是不是1就行了。虽然能解决问题,但是这个方法有点啰嗦。

        我们知道2的次方数二进制表示中只有一个1,而 n &= (n - 1) 这个式子执行一次,二进制表示的数就会少一个1,那如果 n &= (n - 1) 等于0的话,不就说明 n 是2的次方数吗?

 例题4:二进制位置0或置1

              编写代码将11二进制表示的第五位修改为1,然后再改回0。

        11的二进制表示:00000000000000000000000000001011

        修改第五位为1:  00000000000000000000000000011011

        再将第五位改回:00000000000000000000000000001011

        只改第五位,其他位不能改变要怎么实现呢?这就要用到我们学过的按位或(|)操作符了,我们知道,按位或操作符的规则是有1则为1,那我们给11的二进制按位或00000000000000000000000000010000就可以实现只修改第五位而其他位不变的效果,而这个数我们只需要给1向左移4位就能得到。

        那再将第五位修改回来,方法应该也跟上面差不多。这里就要用到按位与(&)操作符,我们知道按位与操作符的规则是有0则为0,那我们给修改过的数按位与上11111111111111111111111111101111就可以实现只修改第五位而保持其他位不变的效果,而这个数我们只需要给1向左移4位再按位取反就能得到。

        通过上面几个例题,我们可以深刻体会到操作符背后强大的功能,而这些作用我们在没有深入学习之前可能根本想象不到。 操作符的作用是很大的,尤其是在嵌入式中,使用操作符来实现一些功能及其频繁。

                                         点击跳转主页—> 💥个人主页小羊在奋斗

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

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

相关文章

区块链论文总结速读--CCF B会议 ICDCS 2023 共8篇

Conference&#xff1a;IEEE 43rd International Conference on Distributed Computing Systems (ICDCS) CCF level&#xff1a;CCF B Categories&#xff1a;Computer Architecture/Parallel and Distributed Computing/Storage Systems 计算机体系结构/并行与分布计算/存储…

【C语言】深入了解文件:简明指南

&#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;C笔记专栏&#xff1a; C笔记 &#x1f308;喜欢的诗句:无人扶我青云志 我自踏雪至山巅 文章目录 一、文件的概念1.1 文件名:1.2 程序文件和数据文件 二、数据文…

可靠的Mac照片恢复解决方案

当您在搜索引擎搜索中输入“Mac照片恢复”时&#xff0c;您将获得数以万计的结果。有很多Mac照片恢复解决方案声称他们可以在Mac OS下恢复丢失的照片。但是&#xff0c;并非互联网上的所有Mac照片恢复解决方案都可以解决您的照片丢失问题。而且您不应该花太多时间寻找可靠的Mac…

4月27日,上海Sui Meetup回顾与展望

活动吸引了超过200名报名者&#xff0c;其中的100多位技术爱好者亲临现场&#xff0c;一同见证了这一精彩时刻。 在这场为技术爱好者和开发者打造的盛会中&#xff0c;嘉宾们带来了内容丰富、见解独到的分享。 Sui 生态的活力与创新得到了充分展现。 在这场技术与创新的盛会…

74、堆-数组中的第K个最大元素

思路&#xff1a; 直接排序是可以的&#xff0c;但是时间复杂度不符合。可以使用优先队列&#xff0c;代码如下&#xff1a; class Solution {public int findKthLargest(int[] nums, int k) {if (numsnull||nums.length0||k<0||k>nums.length){return Integer.MAX_VAL…

CST电磁仿真局部网格设置与仿真结构不参与仿真设置【基础教程】

局部网格设置 使用Local Mesh功能在特定结构&#xff08;区域&#xff09;设置网格 Simulation > Mesh > Local Mesh Properties 仿真模型的构成部件尺寸和复杂度是非常多样的&#xff0c;如果以最复杂的部分为准来划分网格不复杂的部分也会生成非常稠密的网格&#x…

[Java、Android面试]_24_Compose为什么绘制要比XML快?(高频问答)

欢迎查看合集&#xff1a; Java、Android面试高频系列文章合集 本人今年参加了很多面试&#xff0c;也有幸拿到了一些大厂的offer&#xff0c;整理了众多面试资料&#xff0c;后续还会分享众多面试资料。 整理成了面试系列&#xff0c;由于时间有限&#xff0c;每天整理一点&am…

Linux操作系统·进程管理

一、什么是进程 1.作业和进程的概念 Linux是一个多用户多任务的操作系统。多用户是指多个用户可以在同一时间使用计算机系统&#xff1b;多任务是指Linux可以同时执行几个任务&#xff0c;它可以在还未执行完一个任务时又执行另一项任务。为了完成这些任务&#xff0c;系统上…

Android binder死亡通知机制

在Andorid 的binder系统中&#xff0c;当Bn端由于种种原因死亡时&#xff0c;需要通知Bp端&#xff0c;Bp端感知Bn端死亡后&#xff0c;做相应的处理。 使用 Bp需要先注册一个死亡通知&#xff0c;当Bn端死亡时&#xff0c;回调到Bp端。 1&#xff0c;java代码注册死亡通知 …

【webrtc】MessageHandler 9: 基于线程的消息处理:执行Port销毁自己

Port::Port 构造的时候,就触发了一个异步操作,但是这个操作是要在 thread 里执行的,因此要通过post 消息 MSG_DESTROY_IF_DEAD 到thread跑:port的创建并米有要求在thread中 但是port的析构却在thread里 这是为啥呢?

豆瓣9.7,这部Java神作第3版重磅上市!

Java 程序员们开年就有重磅好消息&#xff0c;《Effective Java 中文版&#xff08;原书第 3 版&#xff09;》要上市啦&#xff01; 该书的第1版出版于 2001 年&#xff0c;当时就在业界流传开来&#xff0c;受到广泛赞誉。时至今日&#xff0c;已热销近20年&#xff0c;本书第…

三维SDMTSP:GWO灰狼优化算法求解三维单仓库多旅行商问题,可以更改数据集和起点(MATLAB代码)

一、单仓库多旅行商问题 多旅行商问题&#xff08;Multiple Traveling Salesman Problem, MTSP&#xff09;是著名的旅行商问题&#xff08;Traveling Salesman Problem, TSP&#xff09;的延伸&#xff0c;多旅行商问题定义为&#xff1a;给定一个&#x1d45b;座城市的城市集…

CST Studio初级教程 五

本课程将实例讲解CST 3D建模。CST 3D 建模有三个途径&#xff1a;一种方法是用Brick、Sphere、Cone、Torus、Cylinder、Bond Wire指令绘制实体。第二种方法是用Extrude Face、Rotate Face、loft在已有模型基础上生成实体。第三种方法是&#xff0c;先用2D绘图指令绘制Curves&am…

Apache POI 在java中处理excel

介绍: Apache POI 是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是&#xff0c;我们可以使用 POI 在 Java 程序中对Miscrosoft Office各种文件进行读写操作。 一般情况下&#xff0c;POI 都是用于操作 Excel 文件。 如何使用: 1.maven坐标引入 <depend…

Aker(安碁科技)晶振产品应用和选型

一、石英晶体振荡器简介 在电子电路系统中&#xff0c;特定的动作需要严格按照一定的顺序进行&#xff0c;以确保数据被正确处理和操作&#xff0c;时钟信号就成了系统工作的重要引导者。而且在多模块复杂电路系统中&#xff0c;为了确保不同功能模块能协调一致地工作&#xf…

你用过最好用的AI工具有哪些

一&#xff1a;介绍 随着科技的飞速发展&#xff0c;AI技术已经深入到我们生活的每一个角落&#xff0c;为我们提供了前所未有的便利和可能性。在众多AI工具中&#xff0c;有几种特别受到人们的喜爱&#xff0c;并且在各自的领域中产生了深远的影响。 1、AI绘画工具 改图鸭AI绘…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(七)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 14 节&#xff09; P14《13.ArkUI组件-自定义组件》 将可变部分封装成组件的成员变量&#xff1a; 1、首先给标题添加两个图标&am…

用Docker 创建并运行一个MySQL容器

可以在DockerHub官网上荡:mysql - Official Image | Docker Hub 指令是:docker pull mysql; 因为文件比较大可能时间比较长&#xff0c;我是跟着黑马的课走的 课程提供的有文件&#xff0c;我就用已有的资源了。 在tmp目录里放入mysql.tar包 然后cd进去 输入指令:docker lo…

上位机开发PyQt(五)【Qt Designer】

PyQt5提供了一个可视化图形工具Qt Designer&#xff0c;文件名为designer.exe。如果在电脑上找不到&#xff0c;可以用如下命令进行安装&#xff1a; pip install PyQt5-tools 安装完毕后&#xff0c;可在如下目录找到此工具软件&#xff1a; %LOCALAPPDATA%\Programs\Python\…

设计模式之监听器模式ListenerPattern(三)

一、介绍 监听器模式是一种软件设计模式&#xff0c;在对象的状态发生改变时&#xff0c;允许依赖它的其他对象获得通知。在Java中&#xff0c;可以使用接口和回调机制来实现监听器模式。 二、代码实例 1、事件Event类 package com.xu.demo.listener;// 事件类 public class…