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

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

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

相关文章

JavaScript高级:闭包

1 概念 一个函数对周围状态的引用&#xff0c;捆绑在一起&#xff0c;内层函数中可以访问到外层函数的作用域。 简单理解&#xff1a;闭包 内层函数 外层函数的变量 先看个简单的代码&#xff1a; function outer() {let a 1function inner() {console.log(a)} } outer(…

Mysql-日志介绍 日志配置

环境部署 docker run -d -p 3306:3306 --privilegedtrue -v $(pwd)/logs:/var/lib/logs -v $(pwd)/conf:/etc/mysql/conf.d -v $(pwd)/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD654321 --name mysql mysql:5.7运行指令的目录下新建好这些文件&#xff1a; 日志类型 日…

顶顶通呼叫中心中间件机器人压力测试配置(mod_cti基于FreeSWITCH)

介绍 顶顶通呼叫中心中间件机器人压力测试(mod_cit基于FreeSWITCH) 一、配置acl.conf 打开ccadmin-》点击配置文件-》点击acl.conf-》我这里是已经配置好了的&#xff0c;这里的192.168.31.145是我自己的内网IP&#xff0c;你们还需要自行修改 二、配置线路 打开ccadmin-&g…

mac/macos上编译electron源码

官方教程&#xff1a;Build Instructions | Electron 准备工作这里不写了&#xff0c;参考官方文档&#xff0c;还有上一篇windows编译electron electron源码下载及编译-CSDN博客 差不多步骤&#xff0c;直接来 网络记得使用魔法 下载编译步骤 0. 选择目录很重要&#xff0…

Mac网线上网绿联扩展坞连接网线直接上网-无脑操作

声明&#xff1a;博主使用的绿联扩展坞 以下为绿联扩展坞Mac网线使用方法 1.首先需要下载电脑对应版本的驱动 直接点击即可下载 2. 下载好以后 解压 点进去 对应版本 博主直接使用最新的12-14 3. 安装包好了以后 会提示重启电脑 此时拔掉扩展坞 再重启动 拔掉扩展坞 再重启…

HttpHeaders 源码中headers成员变量为什么声明为final

源码如下 public class HttpHeaders implements MultiValueMap<String, String>, Serializable {private final Map<String, List<String>> headers;public String getFirst(String headerName) {List<String> headerValues (List)this.headers.get(…

2024最新版Visual Studio Code安装使用指南

2024最新版Visual Studio Code安装使用指南 Installation and Usage Guide for the Latest Visual Studio Code in 2024 By JacksonML Visual Studio Code最新版1.85已经于2023年11月由其官网 https://code.visualstudio.com正式发布&#xff0c;这是微软公司2024年发行的的最…

Android App开发基础(1)—— App的开发特点

本文介绍基于Android系统的App开发常识&#xff0c;包括以下几个方面&#xff1a;App开发与其他软件开发有什么不一样&#xff0c;App工程是怎样的组织结构又是怎样配置的&#xff0c;App开发的前后端分离设计是如何运作实现的&#xff0c;App的活动页面是如何创建又是如何跳转…

TensorFlow2实战-系列教程3:猫狗识别1

&#x1f9e1;&#x1f49b;&#x1f49a;TensorFlow2实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Jupyter Notebook中进行 本篇文章配套的代码资源已经上传 1、项目介绍 基本流程&#xff1a; 数据预处理&#xff1a;图像数据处理&#xff0c…

Web3:B站chainlink课程Lesson5遇到的小坑汇总

ethers代码 我用的ethers.js 6 &#xff0c;和视频里一样用的是5的不用看代码部分 ethers.providers.JsonRpcProvider("server") //无了 ethers.JsonRpcProvider("server") //现在的wallet.getTransactionCount() //无了 wallet.getNonce() //现在的Big…

已解决:安卓,怎么优雅接入科大讯飞语音评测功能?

写在前面&#xff1a; 网上关于讯飞接入的博客都很少&#xff0c;按说讯飞都是业界翘楚&#xff0c;不知为何&#xff0c;很少搜索到精品&#xff0c;一搜就是一个要求开会员的博客&#xff0c;我也是醉了。讯飞提供的文档也是不清晰&#xff0c;我是摸着石头过河&#xff0c;…

java集合ArrayList和HashSet的fail-fast与fail-safe以及ConcurrentModificationException

在 java 的集合工具类中&#xff0c;例如对 ArrayList 或者 HashSet 进行删除元素后再遍历元素时&#xff0c;会抛出 ConcurrentModificationException 异常。 fail-fast ArrayList public class TestList {public static void main(String[] args) {ArrayList<Integer>…

【iOS ARKit】BlendShapes

BlendShapes 基础介绍 利用前置摄像头采集到的用户面部表情特征&#xff0c;ARKit 提供了一种更加抽象的表示面部表情的方式&#xff0c;这种表示方式叫作 BlendShapes,BlendShapes 可以翻译成形状融合&#xff0c;在3ds Max 中也叫变形器&#xff0c;这个概念原本用于描述通过…

Ubuntu18编译jdk8源码

环境 系统 ubuntu18 Linux ubuntu 5.4.0-150-generic #167~18.04.1-Ubuntu SMP Wed May 24 00:51:42 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux jdk源码openjdk-8u41-src-b04-14_jan_2020.zip bootJdk jdk-8u391-linux-x64.tar.gz ps -e|grep ssh sudo apt-get install ssh…

【MATLAB第92期】基于MATLAB的集成聚合多输入单输出回归预测方法(LSBoost、Bag)含自动优化超参数和特征敏感性分析功能

【MATLAB第92期】基于MATLAB的集成聚合多输入单输出回归预测方法&#xff08;LSBoost、Bag&#xff09;含自动优化超参数和特征敏感性分析功能 本文展示多种非常用多输入单输出回归预测模型效果。 注&#xff1a;每次运行数据训练集测试集为随机&#xff0c;故对比不严谨&…

京东广告算法架构体系建设--在线模型系统分布式异构计算演变 | 京东零售广告技术团队

一、现状介绍 算法策略在广告行业中起着重要的作用&#xff0c;它可以帮助广告主和广告平台更好地理解用户行为和兴趣&#xff0c;从而优化广告投放策略&#xff0c;提高广告点击率和转化率。模型系统作为承载算法策略的载体&#xff0c;目前承载搜索、推荐、首焦、站外等众多广…

Word插入音乐视频文件快速方法 exe zip doc apk txt pdf bat等

需求&#xff1a; Word插入文件有哪些极限操作&#xff1f;如何快速插入音乐视频等文件 问题解决&#xff1a; 使用拖动进行文件快速插入&#xff08;PPT Excle 同理&#xff09; 操作 1.让文件和word界面处于同一屏幕&#xff0c;可以使用分屏 2.鼠标选中文件左键或者使用笔…

一些反序列化总结

1 反序列化漏洞原理 如果反序列化的内容就是那串字符串&#xff0c;是用户可以控制的&#xff08;即变量的值&#xff09;&#xff0c;且后台不正当的使用了PHP中的魔法函数&#xff0c;就会导致反序列化漏洞&#xff0c;可以执行任意命令。Java 序列化指 Java 对象转换为字节序…

Flink问题解决及性能调优-【Flink根据不同场景状态后端使用调优】

Flink 实时groupby聚合场景操作时&#xff0c;由于使用的是rocksdb状态后端&#xff0c;发现CPU的高负载卡在rocksdb的读写上&#xff0c;导致上游算子背压特别大。通过调优使用hashmap状态后端代替rocksdb状态后端&#xff0c;使吞吐量有了质的飞跃&#xff08;20倍的性能提升…

2024年,你是否还在迷茫?

2024年&#xff0c;你是否还在迷茫&#xff1f; 别担心&#xff01;鸿蒙来了&#xff0c;这个未来技术的制高点&#xff0c;为你提供了答案&#xff01; 诸多大厂疯抢、24年预计鸿蒙相关的岗位需求将达到百万级、就业均薪达到19K&#xff0c;全国高校开课…… 种种现象都在表…