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

C语言06(操作符)

目录

学前须知:

1.移位操作符(<<,>>)

1.1左移操作符

2.2右移操作符

2.位操作符(&,|,^,~)

2.1位操作符的作用

2.2位操作符解题

2.2.1 第一题

2.2.2 第二题

3.逗号表达式

4.总结


学前须知:

1.数据在计算机中是以补码存储的。

2.位移操作符,位操作符直接对内存中存储的补码进行运算。

3.正数的原码,反码,补码均相同。

4.负数原码转为补码,补码转为原码都是符号位不变,数值位取反再+1 。

1.移位操作符(<<,>>)

1.1左移操作符

已知int型数据在内存中占4个字节的大小,且int默认是有符号整数,10的二进制为1010,当左移之后最左边的二进制位会溢出而被抛弃,最右边的数默认补0,因此数值变成了20。

另外还需注意,我们虽然对num << 1,但是num本身的值是不会变的,还是10。

2.2右移操作符

右移操作符和左移操作符大体上一样,但是也有区别,主要分为两种。

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

2.算数右移:左边用该值的原符号位填充,右边丢弃。

那么我们该如何判断是逻辑右移还是算术右移,这个我们可以自己验证一下。

假如说给一个负数,比如说-10,他的符号位是1,那么我们假设我们使用的编译器是算术右移,那么-10的补码右移过后,最左边就应该补1,得到的还是一个负数,那如果我们编译器得到的是逻辑右移呢,右移之后,左边补0,也就是说最后得到的是一个正数。

简单来说:给一个负数,如果右移过后的结果是正数,那么就是逻辑右移,如果结果还是负数,那么就是算数右移。

可以看出-10右移之后的结果是-5,还是一个负数,因此我们使用的解释器使用的是算术右移。同样,我们对num >> 1之后,num本身的值不会发生变化。

2.位操作符(&,|,^,~)

2.1位操作符的作用

& //按位与 | //按位或 ^ //按位异或 ~ //按位取反

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

作用:

1.按位与:对齐的二进制位如果有一个0,该位按位与之后的结果就是0。

2.按位或:对齐的二进制位如果有一个1,该位按位或之后的结果就是1。

3.按位异或:对齐的二进制位只要不相同,该位异或之后的结果就是1。

以上三个操作符的操作数都是2个。

4.按位取反:操作数只有一个,0变1,1变0。

具体如下:

2.2位操作符解题

使用位操作符解题时我们需要先知道关于异或的一些操作

1. a ^ 0 之后的结果还是a

2. a ^ a 之后的结果是0

3.异或支持交换律,也就是说 a ^ b ^ a 其实等同于 a ^ a ^ b ,那么我们就能进一步得到 a^a^b

-> 0^b -> b

以上的结论都可以自己用数值验证。

2.2.1 第一题

如何在不创建第三个变量的前提下,实现两数交换

2.2.2 第二题

编写代码实现:求⼀个整数存储在内存中的⼆进制中1的个数。
要想解这道题我们需要知道这样一个结论:num & 1就能得到num最后一位的值
num & 1 == 1 ---------- num最后一位是1
num & 1 == 0 ---------- num最后一位是0
原理很简单,因为假设是一个int型的数值1按位与上num,那么1的补码就是000……(31个0)……1,只有最后一位是1,所以得到的结果中前面31位必然是0,最后一位要看num的最后一位是否是1,是1的话那么最终结果就是1,num最后一位是0的话,那么最终结果就是0。
因此我们解决该问题的方法如下:
法一:
法二:我们依然需要知道这个结论
每次执行 n = n & (n-1) 得到的结果中,n最右边的1会变成0
可以发现,n本来是1101,结果每执行一次 n & (n-1) 时,n最右边就会少一个1,所以利用这个结论,我们也能解这道题目

3.逗号表达式

逗号表达式,就是⽤逗号隔开的多个表达式。
逗号表达式,从左向右依次执⾏。整个表达式的结果是最后⼀个表达式的结果。

4.总结

通过以上内容,我们可以总结一下位操作符的一些运算技巧。

1. a ^ 0 之后的结果还是a

2. a ^ a 之后的结果是0

3. 异或支持交换律

4. n & 1能得到n最后一位是1还是0

5. 每次执行 n = n & (n-1) 得到的结果中,n最右边的1会变成0

http://www.gsyq.cn/news/1342682.html

相关文章:

  • 080.领域自适应:当你的YOLO在新车间“水土不服”时
  • VxWorks网络通信模块:网络协议栈解析(第五部分)
  • ComfyUI全面掌握-知识点详解——ComfyUI 开发与扩展基础(开发指南+环境搭建)
  • linuxcnc开发环境搭建
  • Win11 右键菜单缺少“新建文本文档“win11 某些软件中文乱码
  • 谷歌关键词优化seo需要怎么做?避开这4个最掏钱的布词误区
  • 2026年整箱榨菜厂家精选合集 - 行业平台推荐
  • Allen-Bradley 280D-F12Z-10B-CR启动控制模块
  • HTTP状态码与请求方式全解析【个人八股】
  • LangChain 是什么?从零开始学会 LangChain 的工程实践指南
  • 性价比高的国产PLM软件公司
  • 3.url编码
  • 关于 ops-transformer 和它背后那套系统,几个我见过最常见的误解
  • VGG16猫狗二分类数据集处理
  • ops-transformer 基础设施性能实验报告:GE 融合边界与 Runtime 调度效率实测
  • 手把手教你学Simulink——轨道车辆牵引电机直接转矩控制(DTC)及其磁链观测器仿真
  • 手把手教你学Simulink——考虑铁损的电动汽车永磁同步电机高阶矢量控制建模
  • 2026AI写作辅助软件实测排行榜!这几款才是真神器
  • Midjourney色彩一致性难题破解(CMYK→sRGB跨域校准实战手册)
  • 计算机毕业设计 | SpringBoot+vue医院药品管理系统(附源码+论文)
  • 078.半监督学习:利用少量标注数据和大量无标签数据训练YOLO
  • 彻底掌控Windows Defender:开源工具defender-control完全指南
  • STM32矩阵按键详解——4×4行列扫描与非阻塞消抖(硬件总结六)
  • 用LLM从零搭3D小世界编辑器|小白也能搞定的AI Native开发实录
  • 注释与常用快捷键
  • 【Unity】MiniGame编辑器小游戏(十六)中国象棋局域网对战【Chinese Chess】(下)
  • 把SAC model的数据导出到BW的ADSO中
  • 强制启动 Cursor IDE 主程序(不带 Agent 模式)
  • AI 的持续学习:从会话中提取可复用知识
  • [具身智能-833]:Ollama部署大模型后,如何与大模型进行通信?