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

C语言第十五弹---操作符(上)

  ✨个人主页: 熬夜学编程的小林

💗系列专栏: 【C语言详解】 【数据结构详解】

操作符

1、操作符的分类

2、二进制和进制转换

2.1、2进制转10进制

2.1.1、10进制转2进制数字

2.2、2进制转8进制和16进制

2.2.2、2进制转16进制

3. 原码、反码、补码

4. 移位操作符

4.1 左移操作符

4.2 右移操作符

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

6. 单目操作符

7. 逗号表达式

总结


1、操作符的分类

算术操作符: + - * / %
移位操作符: <<  >>
位操作符: &  |  ^  ~
赋值操作符: = += -= *= /= %= <<= >>= &= |= ^=
单目操作符: !、 ++ -- & * + - ~ sizeof ( 类型 )
关系操作符: > >= < <= == !=
逻辑操作符: && ||
条件操作符: ? :
逗号表达式: ,
下标引用: []
函数调用: ()
结构成员访问: . ->
上述的操作符,我们已经讲过算术操作符、赋值操作符、逻辑操作符、条件操作符和部分的单目操作符,今天继续介绍⼀部分,操作符中有⼀些操作符和⼆进制有关系,我们先铺垫⼀下⼆进制的和进制转换的知识。

2、二进制和进制转换

其实我们经常能听到2进制、8进制、10进制、16进制这样的讲法,那是什么意思呢? 其实2进制、8进制、10进制、16进制是数值的不同表示形式而已。
比如:数值15的各种进制的表示形式:
15的2进制:1111
15的8进制:17
15的10进制:15
15的16进制:F
我们重点介绍⼀下⼆进制:
首先我们还是得从10进制讲起,其实10进制是我们生活中经常使用的,我们已经形成了很多尝试:
10进制中满10进1
10进制的数字每一位都是0~9的数字组成
其实二进制也是⼀样的
2进制中满2进1
2进制的数字每⼀位都是0~1的数字组成
那么 1101 就是⼆进制的数字了。

2.1、2进制转10进制

其实10进制的123表示的值是⼀百⼆⼗三,为什么是这个值呢?其实 10进制的每⼀位是权重的,10进制的数字从右向左是个位、⼗位、百位....,分别每⼀位的权重是 10^0, 10^1, 10^2...
如下图:
2进制和10进制是类似的,只不过2进制的每⼀位的权重, 从右向左是: 2^0, 2^1, 2^2...
如果是2进制的1101,该怎么理解呢?

2.1.1、10进制转2进制数字

2.2、2进制转8进制和16进制

8进制的数字每⼀位是0~7的,0~7的数字,各自写成2进制,最多有3个2进制位就足够了 ,比如7的⼆进制是111,所以在2进制转8进制数的时候, 从2进制序列中右边低位开始向左每3个2进制位会换算⼀个8进制位,剩余不够3个2进制位的直接换算。
如:2进制的01101011,换成8进制:0153, 0开头的数字,会被当做8进制。

2.2.2、2进制转16进制

16进制的数字每⼀位是0~9,a ~f 的,0~9,a ~f的数字,各自写成2进制,最多有4个2进制位就足够了, 比如 f 的⼆进制是1111,所以在2进制转16进制数的时候, 从2进制序列中右边低位开始向左每4个2进制位会换算⼀个16进制位,剩余不够4个⼆进制位的直接换算。
如:2进制的01101011,换成16进制:0x6b, 16进制表示的时候前面加0x

3. 原码、反码、补码

整数的2进制表示方法有三种,即原码、反码和补码。
有符号整数 的三种表示方法均有 符号位和数值位两部分 2进制序列中,最高位的1位是被当做符号
位,剩余的都是数值位。
符号位都是用0表示“正”,用1表示“负”。
正整数的原、反、补码都相同。
负整数的三种表示方法各不相同。
原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码:反码+1就得到补码。
反码得到原码也是可以使用:取反,+1的操作。
对于整形来说:数据存放内存中其实存放的是补码。
为什么呢?
在计算机系统中,数值⼀律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统⼀处理;同时,加法和减法也可以统⼀处理(CPU只有加法器),此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
此处只讲解原反补码的基本概念,后面章节会详细讲解如何进行计算。

4. 移位操作符

<< 左移操作符
>> 右移操作符
注:移位操作符的操作数只能是整数。

4.1 左移操作符

移位规则:左边抛弃、右边补0
#include <stdio.h>
int main()
{int num = 10;int n = num<<1;printf("n= %d\n", n);printf("num= %d\n", num);return 0;
}

4.2 右移操作符

移位规则:首先右移运算分两种:
1. 逻辑右移:左边用0填充,右边丢弃
2. 算术右移:左边用原该值的符号位填充,右边丢弃
#include <stdio.h>
int main()
{int num = -10;int n = num>>1;printf("n= %d\n", n);printf("num= %d\n", num);return 0;
}

此处暂时记住结论,VS右移时遵守算术右移。后序会详细讲解。

警告⚠️:
对于移位运算符,不要移动负数位,这个是标准未定义的。
例如:
int num = 10;
num>>-1;//error

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

位操作符有 (都是使用二进制计算)
& //按位与    1&1=1 1&0=0 0&0=0 同时为真才为真
| //按位或    1|0=1 1|1=1 0|0=0 一个为真则为真
^ //按位异或  相同为0 相异为1
~ //按位取反  ~0为1 ~1为0
注:他们的操作数必须是整数。
直接上代码:
#include <stdio.h>
int main()
{int num1 = 3;int num2 = 5;printf("%d\n", num1 & num2);printf("%d\n", num1 | num2);printf("%d\n", num1 ^ num2);printf("%d\n", ~0);return 0;
}
初次学习位运算建议用正数举例,因为原反补码相同,更容易理解。
注:屏幕上打印的是原码,计算的是补码,在内存中存储的是补码。
⼀道变态的面试题:
不能创建临时变量(第三个变量),实现两个数的交换。
#include <stdio.h>
int main()
{int a = 10;int b = 20;a = a^b;b = a^b;a = a^b;printf("a = %d b = %d\n", a, b);return 0;
}
练习1:编写代码实现:求⼀个整数存储在 内存中(补码) 的⼆进制中1的个数。
参考代码:
//方法1
#include <stdio.h>
int main()
{int num = 10;int count= 0;//计数while(num){if(num%2 == 1)count++;num = num/2;}printf("二进制中1的个数 = %d\n", count);return 0;
}
//思考这样的实现⽅式有没有问题?

如上图所示,如果为-10,次代码就有问题,因为负数原反补码不相同。

//方法2:
#include <stdio.h>
int main()
{int num = -1;int i = 0;int count = 0;//计数for(i=0; i<32; i++){if( num & (1 << i) )count++; }printf("⼆进制中1的个数 = %d\n",count);return 0;
}
//思考还能不能更加优化,这⾥必须循环32次的。

//⽅法3:
#include <stdio.h>
int main()
{int num = -1;int i = 0;int count = 0;//计数while(num){count++;num = num&(num-1);}printf("⼆进制中1的个数 = %d\n",count);return 0;
}
//这种⽅式是不是很好?达到了优化的效果,但是难以想到。
练习2:⼆进制位置0或者置1
编写代码将13⼆进制序列的第5位修改为1,然后再改回0
13的2进制序列: 00000000000000000000000000001101
将第5位置为1后:00000000000000000000000000011101  
将第5位再置为0:00000000000000000000000000001101
参考代码:
#include <stdio.h>
int main()
{int a = 13;a = a | (1<<4);printf("a = %d\n", a);a = a & ~(1<<4);printf("a = %d\n", a);return 0;
}

6. 单目操作符

单目操作符有这些:
!、 ++ -- & * + - ~ sizeof ( 类型 )
单目操作符的特点是只有⼀个操作数,在单目操作符中 只有&和*没有介绍,这2个操作符,我们放在学习指针的时候学习。

7. 逗号表达式

exp1, exp2, exp3, …expN
逗号表达式,就是用逗号隔开的多个表达式。
逗号表达式,从左向右依次执行。
整个表达式的结果是最后⼀个表达式的结果。
//代码1
#include<stdio.h>
int main()
{int a = 1;int b = 2;int c = (a > b, a = b + 10, a, b = a + 1);//逗号表达式//c是多少?printf("c = %d\n", c);return 0;
}

注:逗号表达式需要小括号包括喔,不然就不是逗号表达式啦!!!
int a = 1;
int b = 2;
int c = (a > b, a = b + 10, a, b = a + 1);//此处为逗号表达式
int c = a > b, a = b + 10, a, b = a + 1;//此处为有问题表达式,a和b都重定义了
//此条代码的实质为下:
int c=a >b;
int a=b + 10;//前面已经定义a了,还定义一次所以导致重定义行为
int a;
int b=a + 1;//前面已经定义b了,海淀一一次所以导致重定义行为

//代码2
if (a =b + 1, c=a / 2, d > 0)


//代码3
a = get_val();
count_val(a);
while (a > 0)
{//业务处理a = get_val();count_val(a);
}
//循环前需要执行一段表达式,循环体也需要执行该段表达式
//符合逗号表达式原则,因此可以在循环条件前加该段表达式
如果使⽤逗号表达式,改写:
while (a = get_val(), count_val(a), a>0)
{//业务处理
}

总结


本篇博客就结束啦,谢谢大家的观看,如果公主少年们有好的建议可以留言喔,谢谢大家啦!

相关文章:

C语言第十五弹---操作符(上)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 操作符 1、操作符的分类 2、二进制和进制转换 2.1、2进制转10进制 2.1.1、10进制转2进制数字 2.2、2进制转8进制和16进制 2.2.2、2进制转16进制 3. 原码、反…...

使用宝塔面板访问MySQL数据库

文章目录 前言一、安装访问工具二、查看数据库总结 前言 前面我们已经部署了前后端项目&#xff0c;但是却不能得到数据库的信息&#xff0c;看有谁再使用你的项目。例如员工、用户等等。本次博客进行讲解如何在宝塔面板里面访问MySQL数据库。 一、安装访问工具 1、打开软件商…...

Win10 双网卡实现同时上内外网

因为需要同时上内网和外网&#xff0c;但公司做了网络隔离&#xff0c;不能同时上内外网&#xff0c;所以多加了块无线网卡&#xff0c;配置双网关实现同时上内外网&#xff0c;互不影响 打开 Windows PowerShell&#xff08;管理员&#xff09;&#xff0c;输入&#xff1a;ro…...

Django模型(六)

一、其它查询 文档:https://docs.djangoproject.com/zh-hans/4.1/ref/models/querysets/#count 1.1、排序 Queryset.order_by(*fields) 默认情况下,QuerySet 返回的结果是按照模型 Meta 中的 ordering 选项给出的排序元组排序的 可以通过使用 order_by 方法在每个 QueryS…...

【Linux】Linux基本指令

目录 1.ls指令 2.cd指令 3.touch指令 4.mkdir指令 5.rmdir指令和rm指令 5.1rmdir指令 5.2rm指令 6.man指令 7.cp指令 8.mv指令 9.cat指令 10.more指令 && less指令 10.1more指令 10.2less指令 11.head指令 && tail指令 11.1head指令 11.2tai…...

stm32中的SPI

SPI的简介 文章目录 SPI的简介物理层协议层基本通讯过程起始和终止信号数据有效性CPOL/CPHA及通讯模式 STM3的SPI特性及架构通讯引脚时钟控制逻辑数据控制逻辑整体控制逻辑通讯过程 代码配置实现指令集结构体的定义SPI时钟信号的定义SPI端口定义SPI命令 flash驱动代码初始化代码…...

ChatGPT可与自定义GPTs一起使用,智能AI代理时代来啦!

1月31日凌晨&#xff0c;OpenAI在社交平台公布了一个超强新功能&#xff0c;可以在ChatGPT中输入“GPTs名字”的方法&#xff0c;调用多个自定义GPTs一起协同工作。 例如&#xff0c;我想开发一款社交APP&#xff0c;1&#xff09;可以先用专业分析GPTs做一下市场调研&#xf…...

《Numpy 简易速速上手小册》第1章:Numpy 基础(2024 最新版)

文章目录 1.1 创建和操作 Numpy 数组1.1.1 基础知识1.1.2 完整案例&#xff1a;多维数据分析1.1.3 拓展案例 1&#xff1a;时间序列数据1.1.4 拓展案例 2&#xff1a;图像数据处理 1.2 数组的索引和切片1.2.1 基础知识1.2.2 完整案例&#xff1a;时间序列分析1.2.3 拓展案例 1&…...

【美团】SaaS技术部-后端研发工程师(海外业务)

部门介绍 美团餐饮系统为餐饮企业提供一站式IT解决方案&#xff0c;帮助餐饮商户实现从供应链管理、生产管理、前厅管理到外卖的数字化经营。美团餐饮系统不仅打通了餐厅和平台&#xff0c;更帮助餐厅连接客人&#xff0c;让商户更了解顾客需求&#xff0c;在帮助商户做商业决…...

linux安装mongodb数据库启动报错? 都是冰红茶滴水儿

先展示报错信息 网上一大推说是关闭不正确导致的,然后给出的解决方法是 ./mongod -f mongodb.conf --repair吊用没有,还是报错: about to fork child process, waiting until server is ready for connections. forked process: 302226 ERROR: child process failed, exited…...

win11安装wsl作为linux子系统并当作服务器

wsl安装 打开控制面板&#xff0c;找到启用或关闭windows功能 开启windows虚拟机监控平台和适用于Linux的Windows子系统&#xff0c;重启电脑。 打开microsoft store搜索ubuntu&#xff0c;找到合适的版本下载安装 输入wsl -l如下所示&#xff0c;即为安装成功。 安装过程比较…...

户用光伏电站的管理包括哪些内容?需要怎么做?

户用光伏电站在运行后需要进行一系列的管理工作&#xff0c;包括安全、运行、质量和数据等等&#xff0c;从而保证电站的安全、经济、高效运行。 1.安全管理 光伏电站的安全管理是非常重要的&#xff0c;包括电站的防雷、防火、防盗等措施&#xff0c;以及电站内部的安全管理…...

Kafka-服务端-PartitionLeaderSelector、ReplicaStateMachine

PartitionLeaderSelector 通过对前面的分析可知&#xff0c;PartitionMachine将Leader副本选举、确定ISR集合的工作委托给了PartitionLeaderSelector接口实现&#xff0c;PartitionMachine可以专注于管理分区状态。这是策略模式的一种典型的应用场景。 图展示了PartitionLead…...

总结11(数组)

数组 1.为什么需要数组 为了解决大量同类型数据的存储和使用问题 为了模拟现实世界 2. 数组的分类 一维数组 1&#xff09;.怎样定义一维数组 为n个变量连续分配存储空间。 所有的变量数据类型必须相同。 所有变量所占的字节大小必须相等。 例子&#xff1a; int a[5]; &#x…...

扩展学习|大数据分析整合到价值创造的大见解

文献来源:Saggi M K, Jain S. A survey towards an integration of big data analytics to big insights for value-creation[J]. Information Processing & Management, 2018, 54(5): 758-790. 下载链接:链接:https://pan.baidu.com/s/14IGaCOc-plxAiaVhwOgUvA 提取码…...

蓝桥杯---牌型种数

小明被劫持到X赌城&#xff0c;被迫与其他3人玩牌。一副扑克牌(去掉大小王牌,共52张)&#xff0c;均匀发给4个人&#xff0c;每个人13张。这时&#xff0c;小明脑子里突然冒出一个问题&#xff1a;如果不考虑花色&#xff0c;只考虑点数&#xff0c;也不考虑自己得到的牌的先后…...

【Linux】VMware Workstation16安装银河麒麟高级服务器操作系统V10 SP3 AMD64

目录 一、麒麟服务器概述 二、安装步骤 设置硬盘大小 完成配置 修改内存 处理器等设备配置 选择直接安装 配置磁盘 网络配置 设置root账号密码 开始安装 启动完成 一、麒麟服务器概述 银河麒麟高级服务器操作系统V10是针对企业级关键业务&#xff0c;适应虚拟化、云…...

中国的茶文化:历史、传统与生活

中国的茶文化&#xff1a;历史、传统与生活 一、引言 茶&#xff0c;这一神奇而古老的饮品&#xff0c;与中国的历史、文化和生活方式紧密相连。中国的茶文化&#xff0c;源远流长&#xff0c;博大精深&#xff0c;是中华文明的重要组成部分。它不仅是一种饮料&#xff0c;更是…...

Oracle函数使用

ROW_NUMBER函数 ROW_NUMBER() OVER(PARTITION BY column1 ORDER BY column2 DESC) -- 根据column1分组按column2降序排序生成序号&#xff0c;序号由小到大,会生成一个唯一的序号 -- 例如column2中有两列值都为1,那他们的序号会有一个在上一个在下ROW_NUMBER() OVER(ORDER BY …...

正则表达式与文本三剑客

目录 一、正则表达式 1. 定义 2. 字符匹配 3. 重复限定符 4. 位置锚点 5. 分组和引用 6. 扩展正则表达式 二、文本三剑客 1. grep 1.1 定义 1.2 语法 1.3 选项 1.4 示例 2. sed 2.1 定义 2.2 通式 2.3 选项 2.4 脚本格式&#xff08;脚本语法&#xff09; 2.…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...

pycharm 设置环境出错

pycharm 设置环境出错 pycharm 新建项目&#xff0c;设置虚拟环境&#xff0c;出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...

[拓扑优化] 1.概述

常见的拓扑优化方法有&#xff1a;均匀化法、变密度法、渐进结构优化法、水平集法、移动可变形组件法等。 常见的数值计算方法有&#xff1a;有限元法、有限差分法、边界元法、离散元法、无网格法、扩展有限元法、等几何分析等。 将上述数值计算方法与拓扑优化方法结合&#…...

字符串哈希+KMP

P10468 兔子与兔子 #include<bits/stdc.h> using namespace std; typedef unsigned long long ull; const int N 1000010; ull a[N], pw[N]; int n; ull gethash(int l, int r){return a[r] - a[l - 1] * pw[r - l 1]; } signed main(){ios::sync_with_stdio(false), …...

嵌入式面试常问问题

以下内容面向嵌入式/系统方向的初学者与面试备考者,全面梳理了以下几大板块,并在每个板块末尾列出常见的面试问答思路,帮助你既能夯实基础,又能应对面试挑战。 一、TCP/IP 协议 1.1 TCP/IP 五层模型概述 链路层(Link Layer) 包括网卡驱动、以太网、Wi‑Fi、PPP 等。负责…...