C语言基础——操作符

3b8f29549e8f46ceb04e1a5508124ebf.gif

     

            ʕ • ᴥ • ʔ             

づ♡ど

 🎉 欢迎点赞支持🎉

个人主页:励志不掉头发的内向程序员;

专栏主页:C语言基础;


文章目录

前言

一、操作符的分类

二、二进制和进制转换

2.1 二进制转十进制

2.1.1 十进制转二进制

2.2 二进制转八进制和十六进制

三、原码、反码、补码

四、移位操作符<< >>

4.1 <<

​编辑

4.2 >>

五、位操作符&、|、^、~

5.1 按位与&

5.2 按位或

5.3 按位异或^

5.4 按位取反~

总结


前言

大家好呀,本章节我打算来和大家来详细的说说操作符,我们前几章节也说过了部分的操作符,在这一章节我们来完善和具体的再来说说,操作符有很多很多,它们之间各自有着各自的作用,可以说每一个都缺一不可,所以说我们大家一起来好好学习学习吧。


一、操作符的分类

af1169e240fe47ebb497c559aea099bc.png

以上便是所有的C语言操作符,在这之中肯定有大家非常眼熟的,当然也有非常多陌生的,现在我们就来讲讲大家陌生的操作符吧,首先是位运算符和移位运算符,它们的主要作用对象是二进制的内容,以防大伙不知道,我们就来讲讲进制转换吧。

二、二进制和进制转换

进制进制,顾名思义就是满多少就进一,十进制就是满十进一,二进制就是满二进一,生活中有各种各样的进制,比如七进制就是我们的一周,60进制就是我们的分钟,24进制就是我们的小时,我们一般普遍使用2、8、10、16进制。其实各种不同的进制只是数值不同的表现形式而已。

2.1 二进制转十进制

我们在了解二进制前可以先拿我们熟悉的十进制下手,来分析分析十进制的规律,比如123,我们读作一百二十三,我们可以发现这三个数字每个的权重都不相同,一个是个位(也就是10的0次方),一个是十位也就是10的1次方),还有一个是百位也就是10的2次方),由此可见,这个123是由3 * 10 ^ 0 + 2 * 10 ^ 1 + 1 * 10 ^ 2 = 123,十进制中的数字只会出现0~9,不可能会超过9,这就是十进制的特征。

我们现在来反推二进制就可以知道,二进制的数字只会出现0~1,也就是0和1,而且权重也是2^0、2^1、2^2等;例如45用二进制表示就是101101,我们来推导一下就知道了:1*2^0 + 0*2^1 + 1*2^2 + 1*2^3 + 0*2^4 + 1*2^5 + = 1 + 0 + 4 + 8 + 0 + 32 = 45;这就是二进制的主要特征,也是二进制转十进制的方式。

23d1f84ce3684cf19f49b8c92f9707f0.png

dd7e0a3127074b54b8739c07394237d1.png

我们也可以按照以上的方式来推推八进制,八进制的数字只会出现0~7,而且权重也是8^0、8^1、8^2等。

52eb3135b8ec4ed3b47a5d4ae9eae36c.png

而十六进制是满16进1,但是阿拉伯数字只有1~10,所以我们就引进了英文数字a~f,所以十六进制只会出现0~f,而且权重也是16^0、16^1、16^2等。

72ad35fdccd048909746ee70b15aaa0c.png

2.1.1 十进制转二进制

在了解了二进制怎么转十进制以后,我们再来看看十进制怎么转二进制,其实也很简单,就是除二取余。如图所示

68dca8c7d6204bf7b672bc8f34874560.png

从下往上读的原因是因为下面除的次数更多,所以说权重更大,就在更左边。当然,如果说有人觉得这种办法蛮难的也没关系,我们既然知道二进制怎么转十进制,我们反推一下不就可以了比如这个十进制的311,我们可以想想二进制可以的最大值是多少,应该是2^8,也就是说二进制应该是1xxxxxxxx,然后我们看看十进制还剩下多少,311-256=55,然后重复步骤,这一次最大是应该是2^5,也就是32,还剩下55-32=23,二进制应该是1001xxxxx,然后再重复,最终得出的结果也是100101111.这就是十进制转换成二进制的方法啦,大家看自己按喜欢方法来就行。

十进制转其他进制的方法也是和上面一样的,这里就不多赘述。

2.2 二进制转八进制和十六进制

我们发现,3个二进制位就能表示一个八进制位比如二进制的111就等于八进制的7,所以说我们把二进制转换成八进制时,就是每三个二进制位转换成一个八进制位,比如1010011011,我们可以把它分为001 010 011 011(不够3位的前面补零),转换成八进制就是1 2 3 3。

二进制转换成十六进制也是如此,我们可以用4个二进制位转换成1个十六进制位,比如:11101001111010011110101,可以把它分成0111 0100 1111 0100 1111 0101(不够的前面补0),转换成十六进制就是7 4 f 4 f 5。

三、原码、反码、补码

整型在计算机中用二进制有3种表示方法,就是原码、反码、补码,可能会有小伙伴们疑惑啦,为什么会有三种,这三种有什么区别嘛,小伙伴们先别急,容我细细说来,我们先来说说我们平时创建的有符号的整型变量在计算机中是如何区分它们的,假如我们创建了一个int a = 10;int b = - 10;那么我们的计算机是如何区分它们之间的区别呢,其实我们有符号整数在计算机中有符号位和数值位两个部分,2进制序列中,最左边的一个二进制位是符号位,剩下的是数值位,就比如a = 00000000000000000000000000001010=10(int型是4个字节,也就是32bit,一个bit代表一个二进制位),而b=10000000000000000000000000001010=-10,看出来了吧,我们二进制最左边的一个二进制位就是符号位,1代表负号,0代表正号,当然,如果是unsigned(无符号类型,前面讲过),那就没有符号位,都是数值位。

我们既然知道了这个道理,那我们就来看看原码、反码、补码吧。

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

反码:将原码除去符号位的其他位依次按位取反(0变成1,1变成0)后得到的就是反码

补码:反码+1后得到的就是补码

补码变成原码除了可以按上面的方式反推回去以外,还可以和上面一样:取反,+1。

正数的原码、反码、补码都是一样的,而负数的原码、反码、补码则要按上面的方式变化。例如

int a = 9

原码:00000000000000000000000000001001;

反码:00000000000000000000000000001001;

补码:00000000000000000000000000001001;

int b = -9

原码:10000000000000000000000000001001;

反码:11111111111111111111111111110110;

补码:11111111111111111111111111110111;

对于整型来说:数据存放在内存中的其实是补码

原因是因为补码将数值的符号位和数值域统一处理;同时也将加法和减法统一处理(CPU只有加法器)就比如我们想算9-9,对于计算机而言相当于9+(-9),如果直接用原码相加则是

9:       00000000000000000000000000001001

-9:+   10000000000000000000000000001001

————————————————————————

-18       10000000000000000000000000010010

发现没,是不是错的离谱,但是我们用补码试试看

9:  00000000000000000000000000001001;

-9:        11111111111111111111111111110111;

————————————————————

补码 00000000000000000000000000000000

我们可以看到符号位是0,也就是说是正数,所以原码、反码、补码相同,所以答案就是0;这就是有原码、反码、补码的原因,也是为什么整型存储的是补码。

四、移位操作符<< >>

1、<<:左移位操作符

2、>>:右移位操作符

注:移位操作符只能操作整数。

4.1 <<

左移操作符的规则是左边丢弃、右边取0

使用方法:

a << 2;

a << 1; 

我们来看看它到底是怎么用的吧。

int main()
{
	int a = 20;
	int b = a << 1;
	printf("a = %d\n", a);
	printf("b = %d\n", b);
	return 0;
}

192f72a54aa8408d933a4a7c43cda96c.png

我们发现b比a乘了个2,难道这个左移位操作符就是乘个2嘛,先别急,我们来看看它的补码再说。

a295b86c33144b0d84e661c12f249785.png

我们可以发现,好像就是把a的整体向左移动了一格,然后左边抛弃,右边补0。

dc4a827c1fda4eaab1365f258dd308ee.png

我们再来看看负数的左移吧。

int main()
{
	int a = -20;
	int b = a << 1;
	printf("a = %d\n", a);
	printf("b = %d\n", b);
	return 0;
}

e62dd895ee414bfeaa22831f9dc9f6b6.png

我们来看看它们的补码

55e5a3fac4c043f69523294350f3a51e.png

可以看出来,它也是左边抛弃,右边补0。

4.2 >>

看过左移操作符的小伙伴们再来看右移操作符时肯定就已经认为自己大致明白了,不就是右边丢弃、左边取0嘛,我们可以来看一下是不是这样的。

int main()
{
	int a = -10;
	int b = a >> 1;
	printf("a = %d\n", a);
	printf("b = %d\n", b);
	return 0;
}

5b810de48f6b4c45adf545226cf6e7c4.png

变成-5啦,我们来看看它们的补码

337cd744b6094d6caa6cd76f1a071616.png

我们可以发现,它本来应该右边抛弃,左边补0的,但是左边却补了一个1,这是为什么呢?

其实右移操作符有两种移动方式,

1、逻辑右移:右边抛弃,左边补0;

2、算数右移:左边用原来该值符号位填充,右边抛弃;

vs编译器就是用的第二种,但是有的会用第一种。

移位操作符不能移动负数位哦,大家要注意。

五、位操作符&、|、^、~

&:按位与(&&:逻辑与)

|:按位或(||:逻辑或)

^:按位异或

~:按位取反

我们来直接看看代码吧

int main()
{
	int a = 10;
	int b = 14;
	printf("& = %d\n", a & b);
	printf("| = %d\n", a | b);
	printf("^ = %d\n", a ^ b);
	printf("~ = %d\n", ~b);
	return 0;
}

f5639c031e654d6e9276c6cce4ae052f.png

我们来一个一个的看看

5.1 按位与&

a:    00000000000000000000000000001010

b:    00000000000000000000000000001110

    &

——————————————————————

10:  00000000000000000000000000001010

通过观察我们可以发现,其实按位与的作用就是如果同时为1就是1,同时为0就是0,否则都是0;

5.2 按位或

a:    00000000000000000000000000001010

b:    00000000000000000000000000001110

    |

——————————————————————

14:  00000000000000000000000000001110

通过观察我们可以发现,其实按位或就是如果有一个1那就是1,否则就是0;

5.3 按位异或^

a:    00000000000000000000000000001010

b:    00000000000000000000000000001110

    ^

——————————————————————

4:   00000000000000000000000000000100

通过观察我们可以发现,其实按位异或就是如果都是相同的则是0,不同的则是1;

5.4 按位取反~

b:    00000000000000000000000000001110

    ~

——————————————————————

-15: 10000000000000000000000000001111

通过观察我们发现我们什么都没法发现,我们把它们都变成补码看看

b:    00000000000000000000000000001110

    ~

——————————————————————

-15:                         1111111111111111110001

我们可以发现,这就是把b反过来了,这就是按位取反的作用。

我想可能会有小伙伴们要问啦,这有什么用啊,由于篇幅太长,下次再讲啦。


总结

以上便是我们的操作符部分的内容,下节课将给大家讲完大部分的操作符的用法,希望大家的继续观看。感谢大家的观看,如果哪里有误,欢迎支持,谢谢大家。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FreeRTOS信号量和互斥量

信息量 简介 信号量是一种解决同步问题的机制&#xff0c;可以实现对共享资源的有序访问。 前面介绍的队列(queue)可以用于传输数据&#xff1a;在任务之间、任务和中断之间。 消息队列用于传输多个数据&#xff0c;但是有时候我们只需要传递状态&#xff0c;这个状态值需要用…

并发编程基础概念

相关概念 并行 并行是指同一个时刻&#xff0c;多个任务同时进行。只有在多核CPU下才会发生。 并发 并发是指单个CPU在不同任务之间来换切换工作&#xff0c;但是同一时刻只有一个任务在工作。由于CPU的切换速度很快&#xff0c;给人的感受是多个任务在一起运行。 串行 串行…

破解对LabVIEW的偏见

LabVIEW被广泛应用于科学研究、工程测试和自动化控制领域&#xff0c;具有专业性和高效的开发能力。尽管有人对其存在偏见&#xff0c;认为不如C语言&#xff0c;但LabVIEW的图形化编程、强大集成能力、丰富社区支持和专业功能&#xff0c;使其在许多实际应用中表现出色。通过多…

山东大学-科技文献阅读与翻译(期末复习)(选择题+翻译)

目录 选择题 Chapter1 1.which of the following is not categorized as scientific literature 2.Which of the followings is defined as tertiary(三级文献) literature? 3.Which type of the following international conferences is listed as Number one conference…

jeecg启动微服务并注册到本地nacos

1、maven勾选环境和微服务模式&#xff0c;并刷新 2、pom文件修改nacos注册地址 3、本地启nacos gateway 和自己想要的cloud下面的模块pos sys 4、打断点测试接口&#xff0c;访问gateway端口和想要测试的地址

Java-记一次Springboot版本升级导致的问题

前言 根据相关情况&#xff0c;需要将SpringBoot的版本由原来的2.1.8.RELEASE版本升级至2.3.8.RELEASE。 启动项目后报错&#xff1a; 具体报错信息如下&#xff1a; Description: An attempt was made to call a method that does not exist. The attempt was made from the…

互联网信任危机:Perplexity搜索引擎如何破坏内容创作者的权益

前段时间&#xff0c;Perplexity搜索引擎还是一颗冉冉升起的明日之星&#xff0c;手握巨额投资&#xff0c;有很美好的未来前景&#xff0c;这时&#xff0c;如果不出意外的话&#xff0c;要出意外。 喜好儿网 Perplexity这家公司&#xff0c;它正试图通过创建一个新型的“答…

UI设计必备的6个网站,赶紧收藏!

6个UI设计必备网站&#xff0c;找素材、找灵感一步到位&#xff0c;赶紧收藏起来吧&#xff01; 1、菜鸟图库 UI图片素材-UI图片模板免费下载 - 菜鸟图库 菜鸟图库提供了超多免费设计素材&#xff0c;在这里你可以找到平面、UI、电商等设计类素材&#xff0c;还有大量的高清背…

数字信号处理实验四(FIR数字滤波器设计)

FIR数字滤波器设计&#xff08;2学时&#xff09; 要求&#xff1a; 设计一个最小阶次的低通FIR数字滤波器&#xff0c;性能指标为&#xff1a;通带0Hz~1500Hz&#xff0c;阻带截止频率2000Hz&#xff0c;通带波动不大于1%&#xff0c;阻带波动不大于1%&#xff0c;采样频率为8…

杂谈咋说-事业编与公务员建议收藏!

杂谈咋说-事业编与公务员建议收藏&#xff01; 什么是铁饭碗 在中国&#xff0c;「铁饭碗」这个词常常被用来形容那些稳定、有保障的工作。 当我们谈论"铁饭碗"时&#xff0c;人们往往会将公务员和事业编制人员进行比较。 尽管这两者都是相对稳定的工作&#xff…

Cesium 在加载 3dTiles 如何如何获取ID

文章目录 问题分析问题 加载的 3dTiles 打印content.getFeature(i)出来后如图所示,想获取到id值 分析 var tileset = mapLayer.init3dTileLayer({url:it.url,maximumMemoryUsage: it.maximumMemoryUsage,

golang使用RSA加密和解密

目录 前提 生成RSA公钥和密钥 读取文件 加密 解密 前提 本文章我们是先读取的RSA文件&#xff0c;所以需要先生成RSA&#xff0c;并且保存在文件中&#xff0c;再进行加密 生成RSA公钥和密钥 如果没有公钥和密钥&#xff0c;可以先看看我上一篇文章 生成RSA公钥和密钥h…

一个AI图片生成工具导航网站

上周末上线了一个AI图片生成工具导航网站&#xff0c;主要是面向AI图片工具这个垂直领域。 https://chatgpt-image-generator.com/ 目标是通过收集当下的一些工具&#xff0c;然后进行分类管理&#xff0c;一方面方便大家发现新的工具&#xff0c;另一方面能够更加有针对性、…

Kotlin vs Java:深入解析两者之间的最新差异与优劣(全面指南)

文章目录 1. 概述2. 语法简洁性3. 空安全4. 扩展函数5. 协程6. 数据类7. 智能类型转换8. 默认参数与命名参数9. 无 checked exceptions10. 单例模式总结 &#x1f389;欢迎来到Java学习路线专栏~探索Java中的静态变量与实例变量 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨…

python CSSE7030

1 Introduction In this assignment, you will implement a (heavily) simplified version of the video game ”Into The Breach”. In this game players defend a set of civilian buildings from giant monsters. In order to achieve this goal, the player commands a s…

上位机图像处理和嵌入式模块部署(mcu之静态库生成和使用)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 很多同学做了很长时间的mcu和keil开发&#xff0c;都认为keil工程中必须包含所有的源代码&#xff0c;其实这是不对的。如果有一些代码我们不希望别…

游戏AI的创造思路-技术基础-深度学习(7)TF

重头戏TF&#xff0c;汽车人&#xff0c;变形~~~~ 现在广泛应用的GPT中&#xff0c;数据处理的关键点就是Transformer算法&#xff0c;多次多层的映射“变形”造就了其对自然语言处理能力的提升&#xff0c;但本篇介绍的内容中&#xff0c;Transformer算法是用来构建游戏AI的“…

深度学习经典检测方法概述

一、深度学习经典检测方法 two-stage&#xff08;两阶段&#xff09;&#xff1a;Faster-rcnn Mask-Rcnn系列 one-stage&#xff08;单阶段&#xff09;&#xff1a;YOLO系列 1. one-stage 最核心的优势&#xff1a;速度非常快&#xff0c;适合做实时检测任务&#xff01; 但是…

【知识图谱系列】(实例)python操作neo4j构建企业间的业务往来的知识图谱

本章节通过聚焦于"金额"这一核心属性,构建了一幅知识图谱,旨在揭示"销售方"与"购买方"间的商业互动网。在这张图谱中,绿色节点象征着购买方,而红色节点则代表了销售方。这两类节点间的紧密连线,不仅映射了双方在市场活动中的合作桥梁,还特…

8个成功的原型设计案例分享

原型设计在整个产品设计过程中非常的重要&#xff0c;定下了整个产品的基调&#xff0c;想要做好原型设计&#xff0c;需要不断的经验的积累&#xff0c;新手入门最快的方式就是学习一些优秀的原型设计案例&#xff0c;今天就为大家分享一些可以直接使用源文件进行编辑和修改的…