操作符详解(C语言)—算数操作符,移位操作符,位操作符

操作符的分类

算术操作符

移位操作符

位操作符

赋值操作符

单目操作符

关系操作符

逻辑操作符

条件操作符

逗号表达式

下标引用、函数调用和结构成员

算术操作符

+    -    *    /    %
  1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
  2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
  3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。
int main()
{
    int a = 3 / 5;
    printf("%d", a);
    return 0;
}

结果是0,因为a是整型变量

那么我想问,如果是这样呢

int main()
{
    float a = 3 / 5;
    printf("%f", a);
    return 0;
}

我们来看结果

image-20240320171001486

其实这里应该这样子理解,是先3/5得到一个数字,放在了a里面,因为3和5都是整数,所以自动进行整数的运算,如果真的想要小数的话

需要除号的两端至少有一个小数

int main()
{
    float a = 3.0 / 5.0;
    printf("%f", a);
    return 0;
}

image-20240320171207030

移位操作符

<< 左移操作符
>> 右移操作符
    
注:移位操作符的操作数只能是整数。
int main()
{
    int a = 2;
    //把a的二进制位向左移动一位
    int b = a << 1;
    printf("%d", b);
    return 0;
}

我们一起来看一下,整型变量,四个字节,三十二个比特位,所以a的二进制真值就应该是

00000000 00000000 00000000 00000010

我们向左移动一位(这里实际上是全部的二进制码向左移动一位,左边的不要,右边加个0)

00000000 00000000 00000000 00000100

所以b的值转换为2进制就应该是4

我们来看结果

image-20240320172236242

左移操作符,左边丢弃,右边补0;

右移

int main()
{
    int a = 10;
    //把a的二进制位向右移动一位
    int b = a >> 1;
    printf("%d", b);
    return 0;
}

a的真值就是

00000000 00000000 00000000 00001010

右移一位

  • 算数右移

    右边丢弃,左边补原符号位

  • 逻辑右移

    右边丢弃,左边补0

00000000 00000000 00000000 00000101

所以呢这里应该是5

image-20240320173837099

我们使用的是算数右移还是逻辑右移呢?

我们一起来测试一下

int main()
{
    int a = -1;
    //把a的二进制位向右移动一位
    int b = a >> 1;
    printf("%d", b);
    return 0;
}

image-20240320174034825

这里还是-1,说明计算机采用的是算数右移

这里为什么是-1而不是0呢?

计算机在存储整数使用的是补码,所以-1的补码是

11111111 11111111 11111111 11111111

右移之后再补符号位依旧是这个,所以右移之后输出的依然是-1

警告⚠ :

对于移位运算符,不要移动负数位,这个是标准未定义的。

int num = 10;
num>>-1;//千万不要这么写,这么写编译器都看不懂

位操作符

& //按位与     全真为真
| //按位或     有真为真
^ //按位异或   相异为真
注:他们的操作数必须是整数。
按位与
int main()
{
    int a = 3;
    int b = 5;
    int c = a & b;
    //
    //a的二进制真值 00000000 00000000 00000000 00000011
    //b的二进制真值 00000000 00000000 00000000 00000101
    //按位与        00000000 00000000 00000000 00000001
    printf("%d", c);
    return 0;
}

我们看一下结果

image-20240320175053450

按位或
int main()
{
    int a = 3;
    int b = 5;
    int c = a | b;
    //
    //a的二进制真值 00000000 00000000 00000000 00000011
    //b的二进制真值 00000000 00000000 00000000 00000101
    //按位或        00000000 00000000 00000000 00000111
    printf("%d", c);
    return 0;
}

image-20240320175327355

按位异或
int main()
{
    int a = 3;
    int b = 5;
    int c = a ^ b;
    //
    //a的二进制真值 00000000 00000000 00000000 00000011
    //b的二进制真值 00000000 00000000 00000000 00000101
    //按位异或      00000000 00000000 00000000 00000110
    printf("%d", c);
    return 0;
}

image-20240320175444612

面试题

如何交换两个变量的值,不能使用第三个变量,即a=3,b=5,交换后a=5,b=3?

先思考一分钟

一般来说,我们都是这样子实现的

c = a;
a = b;
b = c;

揭晓答案

方法1:

a = a + b;
b = a - b;
a = a - b;

但是这种方法其实有缺陷,如果数值太大是有可能出现溢出的情况的

方法2:

异或

a = a ^ b;
b = a ^ b;
a = a ^ b;

我们先来验证一下

int main()
{
    int a = 3;
    int b = 5;

    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;
}

image-20240320180705850

我们来简单分析一下

a = 3     二进制     011
b = 5     二进制     101
    
a = a ^ b;          110
     
b = a ^ b;          011
    
a = a ^ b;          101
    
a = 5     二进制     101
b = 3     二进制     110

我们其实可以这样子理解

我们把a和b进行按位或,也就是说我们通过a和b生成了一个密码,这个密码由a和b得到
    
我们使用b进行译码,就能得到a
    
我们使用a进行译码,就能得到b

好,那么今天先到这,剩下的操作符明天再说

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

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

相关文章

Unity Mesh简化为Cube mesh

Mesh简化为Cube mesh &#x1f373;食用&#x1f959;子物体独立生成CubeMesh&#x1f96a;合并成一个CubeMesh&#x1f32d;Demo &#x1f373;食用 下载并导入插件&#x1f448;即可在代码中调用。 &#x1f959;子物体独立生成CubeMesh gameObject.ToCubeMesh_Invidual()…

关于 HTTP 协议,你了解多少?

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…

数据分析的具体流程

1.导入 表格导入数据时要注意数据的格式问题非表格导入 可以先将文档放入word中 将换行符&#xff08;^p&#xff09;替换为|||&#xff0c;选择特殊格式中的段落标记 进行全部替换 以每一列最后的数据/平&#xff0c;作为换行的标志 将所整理的信息导入excel,对数据进行分列 选…

数据库系统概论-第5章 数据库完整性

5.1 实体完整性 5.2 参照完整性 5.3 用户定义完整性 5.4 完整性约束命名子句 5.5 域中的完整性限制 5.6 断言 5.7 触发器 5.8 小结

OpenGL+QT实现矢量和影像的叠加绘制

一、QT下OpenGL框架的初始化 OpenGL的介绍我在这里就没有必要介绍了&#xff0c;那OpenGL和QT的结合在这里就有必要先介绍一下&#xff0c;也就是怎么使用QT下的OpenGL框架。要想使用QT下的OpenGL框架&#xff0c;就必须要子类化QGLWidget&#xff0c;然后实现。 void initia…

冶炼金属 (第十四届蓝桥杯省赛C++ B组)详解(二分+推公式)

题目描述&#xff1a; 小蓝有一个神奇的炉子用于将普通金属 O 冶炼成为一种特殊金属 X。 这个炉子有一个称作转换率的属性 V&#xff0c;V 是一个正整数&#xff0c;这意味着消耗 V 个普通金属 O 恰好可以冶炼出一个特殊金属 X&#xff0c;当普通金属 O 的数目不足 V 时&#…

Spring MVC文件下载配置

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 文件下载 在Spring MVC中通常利用commons-io实现文件下载&#xff0c;示例代码如下&#xff1a; Controller RequestMapping("......") public class DownloadC…

AI大模型-Grok搭建

Grok搭建 硬件要求项目下载Checkpoint下载运行代码 马斯克又搞事情了&#xff0c;正式开源AI大模型Grok-1&#xff0c;免费还可商用&#xff0c;国内AI技术即将迎来重大突破。笔者简单整合了一下&#xff0c;如何搭建Grok-1的思路&#xff0c;供后期自己搭建以及读者学习使用。…

房屋租赁系统|基于JSP技术+ Mysql+Java+ B/S结构的房屋租赁系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;ssm&#xff0c;springboot的平台设计与实现项目系统开发资源&#xff08;可…

理解数据库习题

1.选择 &#xff08;1&#xff09;现实世界中客观存在并能相互区别的事物称为&#xff08; &#xff09;。 A.实体 B.实体集 C字段 D 记录 &#xff08;2&#xff09;下列实体类型的联系中&#xff0c;属于一对一联系的是&#xff08; &#xff09;A.教研室对教师的所属联系 …

centos 环境部署

一、安装redis 1. 升级 GCC 最直接的解决方式是升级你的 GCC 编译器到支持 C11 标准的版本。CentOS 7 默认的 GCC 版本较旧&#xff0c;可能不支持 _Atomic。你可以通过以下步骤升级 GCC&#xff1a; 启用 CentOS 的 Software Collections (SCL) 仓库&#xff0c;该仓库提供了…

力扣---完全平方数

思路&#xff1a; 还是比较好想的&#xff0c;g[i]定义为和为 i 的完全平方数的最少数量。那么递推关系式是g[i]min(g[i-1],g[i-4],g[i-9],...)1&#xff0c;数组初始化是g[0]0,g[1]1。注意这里要对g[0]初始化&#xff0c;&#xff08;举个例子&#xff09;因为在遍历到g[4]时&…

docker安装Milvus

docker安装Milvus 拉去CPU版本的milvus镜像 $ sudo docker pull milvusdb/milvus:0.10.0-cpu-d061620-5f3c00 docker pull milvusdb/milvus:0.10.0-cpu-d061620-5f3c00 mkdir -p milvus/conf cd milvus/conf ls wget https://raw.githubusercontent.com/milvus-io/milvus/v0.1…

未来教育趋势:AI个性化培训如何推动企业与员工共赢

AI定制学习&#xff1a;重新定义个性化员工培训的未来 随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;我们正目睹并亲历了AI在培训领域所引发的根本性变革。AI技术的整合不仅革新了知识传递的模式&#xff0c;而且重新塑造了个性化学习的内涵。依托于尖端算…

平替电容笔哪个品牌好?推荐五款 2024 高人气电容笔,入手不亏!

作为一名有着多年测评数码经验的评测师&#xff0c;用过的原装笔和平替电容笔加起来也有不下十款了&#xff0c;看过也有很多朋友因为选错电容笔&#xff0c;导致书写效率低&#xff0c;体验感差的例子也数不胜数。这并非夸大其词&#xff0c;因为不专业产品的最大弊端就是毫无…

segformer多分类语义分割

前言 本期将分享「Segformer」&#xff0c;论文地址https://arxiv.org/abs/2105.15203。 Segformer简介 全局上下文信息: 由于Transformer的自注意力机制&#xff0c;Segformer可以在整个图像范围内捕获上下文信息&#xff0c;而不受局部感受野的限制&#xff0c;这有助于提高分…

开放签开源电子签章白皮书-简版

开放签开源电子签章白皮书-简版 一、摘要&#xff1a; 开放签电子签章团队源自于电子合同SaaS公司&#xff0c;立志于通过开源、开放的模式&#xff0c;结合团队十多年的行业经验&#xff0c;将电子签章产品更简单、更低门槛的推广到各行各业中。让电子签章应用更简单&#x…

动态路由协议-OSPF与LSA简介

一、概述 前面路由基础学习了路由的类型可以按照动静态路由分类&#xff0c;静态路由就是直连和手动配置的路由&#xff0c;而动态路由协议是各路由器相互动态学习的一种路由协议&#xff0c;现在常用的有OSPF和ISIS路由协议&#xff0c;前面在基础篇我们也已经对OSPF有一个简单…

记录我的第一次面试

面试感受 这是我的第一次面试&#xff0c;我感觉我这次面试的很差&#xff0c;很糟糕&#xff0c;十分的糟糕&#xff0c;万分的糟糕。第一次面试&#xff0c;面试了半个小时。我去真的好紧张&#xff0c;脑子里一篇空白。脑子空白还不是最惨的&#xff0c;最惨的是那个八股文…

MySQL的概述与安装

一、数据库的基本概念&#xff1a; 1.1 数据&#xff1a; 1&#xff09; 描述事物的符号记录称为数据&#xff08;Data&#xff09;。数字、文字、图形、图像、声音、档案记录等 都是数据。 2&#xff09;数据是以“记录”的形式按照统一的格式进行存储的&#xff0c;而不是…