当前位置: 首页 > news >正文

【c语言】详解操作符(上)

1. 操作符的分类

2. 原码、反码、补码

整数的2进制表示方法有三种,即原码、反码、补码

有符号整数的三种表示方法均有符号位和数值位两部分,2进制序列中,最高位的1位是被当做符号位其余都是数值位。

符号位都是用0表示“正”,用1表示“负”。

例:分别写出1、-1的2进制

int a = 1;
int b = -1;

其中a、b都是整形变量,是4个字节,32bit位,那么a、b的2进制为:

a:00000000000000000000000000000001

b:10000000000000000000000000000001

正整数的原码、反码、补码都相同

负数的三种表示方法各有不同

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

反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。

补码:反码加1就可以得到补码。

补码得到原码也是可以使用取反加1的操作。

例:分别写出-10的原码、反码、补码

原码:10000000000000000000000000001010

反码:11111111111111111111111111110101

补码:11111111111111111111111111110110

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

为什么呢?

  1. 简化计算:使用补码可以将符号位和数值位统一处理,这样无论是正数还是负数,都可以用同一套逻辑来进行加减运算。由于计算机的CPU只有加法器,没有减法器,通过补码可以将减法运算转换为加法运算,从而简化了硬件设计。
  2. 避免歧义:补码的表示方法确保了0的编码只有一个,不会出现两个不同的编码对应同一个数0的情况。这对于避免数据表示上的歧义非常重要。
  3. 提高存储效率:原码、反码和补码是二进制数的三种不同表示方法。原码是最直观的表示方法,但它在表示负数时需要额外的符号位,并且在进行运算时需要分别处理正负号。反码是对原码的改进,它将负数的符号位保持不变,数值位取反。而补码则是在反码的基础上加1,它不仅解决了0的表示问题,还可以通过补码直接进行加减运算,无需额外的硬件电路。
  4. 方便逻辑电路实现:计算机由逻辑电路组成,逻辑电路通常只有两种状态,即开关的接通与断开,刚好可以表示成‘1’和‘0’。因此,计算机只存储二进制数据,而补码作为一种二进制表示方法,非常适合于计算机的逻辑电路实现。

3. 移位操作符(移动的是二进制位)

<< 左移操作符

>> 右移操作符 

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

3.1 左移操作符

左移操作符有一个乘以2的n次方的效果(n为<<后面的数字)

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

例1:

上图中a的补码为:

00000000000000000000000000000110

其中b = a << 1,那么在a的补码的基础上抛弃左边的1位,然后在右边补上一个0,可得b的补码:

00000000000000000000000000001100

例2:

a的补码为:11111111111111111111111111111010

b得到的补码:11111111111111111111111111110100

3.2 右移操作符

左移操作符有一个除以2的n次方的效果(n为>>后面的数字)

移位规则:

1. 逻辑右移:左边用0填充,右边丢弃。

2. 算术右移,左边用原值的符号位(原值是正数就用0,是负数就用1)填充,右边丢弃。 

注:是逻辑右移还是算术右移是取决于编译器的实现,常见的编译器都是算术右移。 

算术右移: 

 a的补码为:11111111111111111111111111111010

b得到的补码:11111111111111111111111111111101

 4. 位操作符:&、|、^、~

1. &                     按位与

2.  |                      按位或

3. ^                      按位异或

4. ~                     按位取反

注:它们的操作数必须是整数 

4.1 &

运算规则:

&左右两个数的补码中有0就取0,两个同时为1才取1

例:

3的补码为 :0000000000000000000000000000011

-5的补码为:11111111111111111111111111111011

c得到的补码为:0000000000000000000000000000011

4.2 |

运算规则:

|左右两个数的补码中有1就取1,两个同时为0才取0

例:

3的补码为 :0000000000000000000000000000011

-5的补码为:11111111111111111111111111111011

c得到的补码为:11111111111111111111111111111011

4.3 ^ 

运算规则:

相同为0,相异位1. 

3的补码为 :0000000000000000000000000000011

-5的补码为:11111111111111111111111111111011

c得到的补码为:11111111111111111111111111111000

例题:不使用临时变量的情况下,交换a和b的值

由^的运算规则我们可以知道当^两边的数相同时,所得到的结果为0,而0^a=a,所以我们利用这个规律我们就可以在不使用临时变量的情况下,交换a和b的值,如下图:

4.4  ~

运算结果为~右边的数+1然后取相反数,例如:~1 = -2,~-1 = 0

运算规则:

对~右边的数的2进制按位取反

0的2进制为: 0000000000000000000000000000000

b得到的补码为:11111111111111111111111111111111

5练习:

练习1:

编写代码实现:求一个整数存储在内存中补码中1的个数。

法1:

由&的运算规则我们可以知道a&1=1的式子成立时,就说明a的补码最右边的数为1,从这里可以知道,依次将a的补码的32个数依次移动到最右边(这里可以使用右移操作符(>>)移动),然后统计有几个符合a&1=1,就可以求出这个整数存储在内存中补码中1的个数。

以13为例,求13在内存中补码中1的个数:

13的补码:
00000000000000000000000000001101
1的补码:
00000000000000000000000000000001

法2: 

int main()
{int n = 0;scanf("%d", &n);int count = 0;while (n){n = n & (n - 1);count++;}printf("%d\n", count);return 0;
}

思考题:

如何判断一个数是否是2的次方数?

2的n次方数的二进制中只有1个1,而式子n&(n-1)就可以直接把这个1去掉了,所以要想判断一个数是否是2的次方数,只需要判断等式n&(n-1)== 0是否成立就可以了。

练习2:

二进制位置1或者置0

编码代码将13二进制序列的第5位修改为1,然后再改为0

13的2进制序列:

00000000000000000000000000001101

将5位置为1后:

00000000000000000000000000011101

将5位置为0后:

00000000000000000000000000001101

int main()
{int a = 13;//将5位置为1a |= 1 << 4;printf("%d\n", a);//将5位置为0a &= ~(1 << 4);printf("%d\n", a);return 0;
}

6. 逗号表达式

exp1,exp2,exp3,....,expN

用逗号隔开的表达式就是逗号表达式。

逗号表达式,从左向右依次执行,整个表达式的结果是最后一个表达式的结果。

例1:计算下列表达式c中的结果:

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

表达式的运行过程为:a>b(为假,但不影响表达式的结果) -> a=b + 10 -> 12 -> b = a + 1 = 13

因为最终决定表示结果的是表达式:b = a + 1,所以最终的结果为:13

 例2:

逗号表达式在if语句中真正起判断作用的是最后一个表达式 。

7. 下标访问[ ]、函数调用( ) 

7.1 [ ] 下标引用操作符

操作数:一个数组名 + 一个索引值(下标)

7.2 函数调用操作符

接受一个或多个操作数:第一个操作数是函数名,剩下的操作数就是传给函数的参数。

#include<stdio.h>
int main()
{printf("hello world!\n");//( )函数调用操作符return 0;
}

相关文章:

【c语言】详解操作符(上)

1. 操作符的分类 2. 原码、反码、补码 整数的2进制表示方法有三种&#xff0c;即原码、反码、补码 有符号整数的三种表示方法均有符号位和数值位两部分&#xff0c;2进制序列中&#xff0c;最高位的1位是被当做符号位其余都是数值位。 符号位都是用0表示“正”&#xff0c;用…...

VR全景展示:传统制造业如何保持竞争优势?

在结束不久的两会上&#xff0c;数字化经济和创新技术再度成为了热门话题。我国制造产业链完备&#xff0c;但是目前依旧面临着市场需求不足、成本传导压力加大等因素影响&#xff0c;那么传统制造业该如何保持竞争优势呢&#xff1f; 在制造行业中&#xff0c;VR全景展示的应用…...

2.7、创建列表(List)

概述 列表是一种复杂的容器&#xff0c;当列表项达到一定数量&#xff0c;内容超过屏幕大小时&#xff0c;可以自动提供滚动功能。它适合用于呈现同类数据类型或数据类型集&#xff0c;例如图片和文本。在列表中显示数据集合是许多应用程序中的常见要求&#xff08;如通讯录、…...

solr functionquery函数查询自定义函数实现

Solr是一个开源的搜索平台&#xff0c;基于Apache Lucene库构建&#xff0c;主要用于提供全文搜索的功能。它被设计为一个高度可靠、可扩展的搜索应用服务器。以下是Solr的一些主要使用场景&#xff1a; 全文搜索&#xff1a;Solr最核心的功能是提供全文搜索&#xff0c;它可以…...

如何将 Parallels虚拟机 安装或者迁移到 移动硬盘 or U盘?

本文讨论主题 如何安装 Parallels 虚拟机到移动硬盘和U盘? 已经安装到了mac上的虚拟机如何迁移到移动硬盘活着U盘上? 关于Parallels Deskshop 19 虚拟机 安装激活,文末关注公众号AIshape,回复:PD 进行获取通过将虚拟机安装在外置的移动硬盘U盘上,可以节省mac本身SSD的容…...

大型网站集群管理负载均衡

课程介绍 结合企业大规模应用&#xff0c;解决应用高并发问题&#xff0c;解决单节点故障问题&#xff0c;缓存数据库的应用。学完掌握知识点&#xff1a;企业应用实现四七层负载均衡&#xff0c;以及Nginx等应用的高可用性&#xff0c;Redis缓存数据库的部署应用以及高可用方…...

JAVA使用POI实现Excel单元格合并-02

JAVA使用POI实现Excel单元格合并 实现效果 解释&#xff1a;只要是遇见与前一行相同的数据就合并 引入jar <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.2</version></depe…...

深入了解 Linux 中的 MTD 设备:/dev/mtd* 与 /dev/mtdblock*

目录 前言一、什么是MTD子系统&#xff1f;二、 /dev/mtd* 设备文件用途注意事项 三、/dev/mtdblock* 设备文件用途注意事项 三、这两种设备文件的关系四、关norflash的一些小知识 前言 在嵌入式Linux系统的世界里&#xff0c;非易失性存储技术扮演着至关重要的角色。MTD&#…...

2、Spring CLI安装

安装 Spring CLI 提供了多种格式,让您选择自己喜欢的安装方法。可下载的制品可从发布页面获取。 二进制发行版 WindowsLinuxMac手动安装(Windows,其他自己看) spring-cli-standalone-<version>-windows.x86_64.zip - 打包了 x86 JDKspring-cli-installer-<versi…...

数据库备份工具(实现数据定时覆盖)

数据库备份工具&#xff08;实现数据定时覆盖&#xff09; 永远热爱&#xff0c;永远执着&#xff01; 工具介绍 自动化测试数据库更新调度程序 这段 Python 脚本自动化了每天定时从生产数据库更新测试数据库的过程。它利用了 schedule 库来安排并执行每天指定时间的更新任务…...

测试环境搭建整套大数据系统(十二:挂载磁盘到hadoop环境)

一&#xff1a;链接硬盘 将硬盘连接到计算机的 SATA 接口或 USB 接口&#xff0c;并确保硬盘通电并处于可用状态。 二&#xff1a;查看硬盘信息 sudo fdisk -l三&#xff1a;创建分区 gdisk /dev/vbd重新扫描磁盘 partprobe /dev/vdb格式化磁盘 mkfs.ext4 /dev/vdb2查看磁…...

Spring事务核心:声明式事务注解式事务

全解&#xff1a;声明式事务和注解事务 在Spring中&#xff0c;事务管理是一个非常重要的特性&#xff0c;它可以帮助开发者在应用程序中实现事务控制。Spring提供了两种事务管理方式&#xff1a;声明式事务和注解事务。 1. 声明式事务 声明式事务是指通过配置文件或注解的方…...

AcWing 1015. 摘花生

Problem: AcWing 1015. 摘花生 文章目录 思路解题方法复杂度Code 思路 这是一个典型的动态规划问题。我们需要在一个二维网格中&#xff0c;从左上角走到右下角&#xff0c;每次只能向右或向下移动&#xff0c;目标是使得经过的路径上的数字之和最大。 我们可以定义dp[i][j]为从…...

Dalle-3、Sora、Stable Diffusion 3 掀起AIGC新浪潮

随着科技的飞速发展&#xff0c;我们迎来了视觉AIGC高光时刻&#xff0c;一个充满无限可能与机遇的新时代。在这个时代里&#xff0c;三大里程碑Dalle-3、Sora和Stable Diffusion 3以其炸裂式的技术发展&#xff0c;引领着AIGC领域的新浪潮。文章首先做相应简要介绍&#xff0c…...

Unity 视频组件 VideoPlayer

组件添加&#xff1a; 在自己定义的组件下&#xff08;例如&#xff1a;Panel&#xff09; 点击 Inspector 面板中的 AddComponent &#xff0c;输入“VideoPlayer”。 资源 这里 视频资源有两种形式&#xff0c;第一种是 VideoClip &#xff0c;需要将视频文件拖拽到该属性字段…...

RSTP环路避免实验(华为)

思科设备参考&#xff1a;RSTP环路避免实验&#xff08;思科&#xff09; 一&#xff0c;技术简介 RSTP (Rapid Spanning Tree Protocol) 是从STP发展而来 • RSTP标准版本为IEEE802.1w • RSTP具备STP的所有功能&#xff0c;可以兼容STP运行 • RSTP和STP有所不同 减少了…...

Arduino IDE工程代码多文件编程和中文设置

一、esp8266模块信息 二、中英文切换 点击文件( File )–选择首选项( Preference )—选择语言( Language )—选择中文–点击确定( OK ) 三、多文件编程 在Arduino编程中&#xff0c;将代码分割成多个文件是一种很好的做法&#xff0c;特别是项目变得越来越大和复杂时。这样…...

【微服务】Eureka(服务注册,服务发现)

文章目录 1.基本介绍1.学前说明2.当前架构分析1.示意图2.问题分析 3.引出Eureka1.项目架构分析2.上图解读 2.创建单机版的Eureka1.创建 e-commerce-eureka-server-9001 子模块2.检查父子pom.xml1.子 pom.xml2.父 pom.xml 3.pom.xml 引入依赖4.application.yml 配置eureka服务5.…...

windows上ssh设置代理,直接访问公司内网

ssh设置代理一般来说很简单&#xff0c;对于无密码或者可以支持密钥登录的&#xff0c;都比较无脑 难的地方在于使用用户名密码认证来使用一个http的代理或者socks5的代理&#xff0c;密码如何设置&#xff1f;特殊字符如何处理&#xff1f; 直接上答案&#xff0c;.ssh/conf…...

C++ union用法

在C中&#xff0c;union是一种特殊的数据类型&#xff0c;可以在同一个内存位置存储不同的数据类型。它的用法如下&#xff1a; 1. 声明union类型&#xff1a;使用关键字union加上union名称来声明一个union类型。 c union UnionName { dataType1 member1; dataType2 …...

山东大学软件学院项目实训-基于语言大模型的智能居家养老健康守护系统-个人博客(五)

智能健康陪诊与个性化干预 Agent 的设计与实现 前言 在基于语言大模型的智能居家养老系统中&#xff0c;我主要负责面向老人端的两个核心 AI Agent 的构建&#xff1a;健康陪诊 Agent 与 健康干预 Agent。前者作为首页全科问答入口提供 24 小时健康咨询服务&#xff0c;后者深度…...

Unity安卓游戏开发实战:从构建失败到上线合规的工程化路径

1. 为什么“精通Unity安卓游戏开发”不是一句口号&#xff0c;而是一道必须拆解的工程题很多人看到“精通Unity安卓游戏开发”这个标题&#xff0c;第一反应是&#xff1a;不就是用Unity写个游戏&#xff0c;然后点一下Build Android&#xff1f;我做过三个小游戏&#xff0c;打…...

吉利银河星耀7 MAX上市:零百加速5.4秒 指导价9.88万起

雷递网 乐天 5月24日吉利银河旗下全新中级豪华电混轿车——吉利银河星耀7 MAX正式上市。新车全系标配四驱&#xff0c;有220km四驱星耀版、220km四驱探索版、220km四驱领航版、220km四驱远航版4个版本&#xff0c;同时&#xff0c;官方还提供四驱远航版两驱反选权益&#xff0c…...

2026年智传民韵Scratch图形化编程(小学组4-6年级)模拟卷(一)以及答案

2026年智传民韵Scratch图形化编程(小学组4-6年级)模拟卷(一) 考试时间:60分钟 总分:100 及格分:60 一、单选题 (共15题,每题5分) 1、嫦娥奔月”:按照以下程序运行: A:(100, 25) B:(1, 100) C:(120, 50) D:(80, 30) 【正确答案】 A 【试题解析】 2…...

Rust错误处理最佳实践:从Result到自定义错误类型

引言 错误处理是任何编程语言的核心部分。作为从Python转向Rust的开发者&#xff0c;我发现Rust的错误处理机制与Python有很大不同。Rust通过Result类型和?操作符提供了类型安全的错误处理方式。本文将深入探讨Rust错误处理的最佳实践&#xff0c;帮助你编写健壮的代码。 一…...

深度解析美国RTP全系列导热工程塑料,革新电子散热新选择

在工程塑料行业高速发展的今天&#xff0c;电子设备散热需求日益成为制约产品性能与可靠性的关键瓶颈。传统散热材料面临导热效率低、机械性能弱、加工适应性差等多重挑战&#xff0c;行业亟待寻找既能满足严苛散热要求&#xff0c;又具备优异综合性能的新一代解决方案。美国RT…...

前端可访问性:表单验证的无障碍实现指南

前端可访问性&#xff1a;表单验证的无障碍实现指南 前言 各位前端小伙伴&#xff0c;今天咱们来聊聊表单验证的无障碍问题。想象一下&#xff1a; 用户填写表单时出错了视力正常的用户看到红色错误提示但屏幕阅读器用户可能完全不知道发生了什么键盘用户也可能错过错误信息 这…...

Python 开发者如何通过 Taotoken 快速接入多款大模型 API

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Python 开发者如何通过 Taotoken 快速接入多款大模型 API 对于需要频繁实验不同大模型能力的 Python 开发者而言&#xff0c;管理多…...

TVA视觉智能体专栏(四):工业视觉最大痛点:换产必重训、环境必调参?TVA彻底根治

摘要&#xff1a;传统视觉项目换产、改工艺、环境变化后&#xff0c;必须工程师驻场调参、补充样本、重新训练&#xff0c;维护成本极高。本文详解TVA环境自适应能力&#xff0c;无需人工干预&#xff0c;自动适配光影、角度、物料差异&#xff0c;大幅降低产线运维成本。一、工…...

论文初稿被批太水?青年教师力荐这几个AI论文写作软件

想写论文又快又好&#xff0c;关键是用对 AI 工具、走对流程——资深教授普遍推荐&#xff1a;千笔AI&#xff08;中文全流程首选&#xff09; 豆包学术版&#xff08;轻量高效&#xff09; DeepSeek 学术版&#xff08;理工 / 长文本&#xff09; Grammarly Academic&#xff…...