【C语言基础】:操作符详解(一)
文章目录
- 操作符详解
- 1. 操作符的分类
- 2. 二进制和进制转换
- 2.1 什么是二进制、八进制、十进制、十六进制
- 2.1.1 二进制和进制转换
- 2.1.2 二进制转十进制
- 2.2.3 二进制转八进制
- 2.2.4 二进制转十六进制
- 3. 源码、反码、补码
- 4. 移位操作符
- 4.1 左移操作符
- 4.2 右移操作符
- 5. 位操作符:&、|、^、~
- 5.1 按位与 &
- 5.2 按位或 |
- 5.3 按位异或 ^
- 5.5 按位取反 ~
操作符详解
1. 操作符的分类
C语言中,操作符分为算术操作符、赋值操作符、逻辑操作符、条件操作符和单目操作符等等。
. 算术操作符:+ 、- 、* 、 %
. 移位操作符: << >>
. 位操作符: &、|、^
. 赋值操作符: = 、+= 、 -= 、 = 、 /= 、%= 、<<= 、>>= 、&= 、|= 、^=
. 单目操作符: ! 、++、–、&、、+、-、~ 、sizeof(类型)
. 关系操作符: > 、>= 、< 、<= 、 == 、 !=
. 逻辑操作符: && 、||
. 条件操作符: ? :
. 逗号表达式: ,
. 下标引用: []
. 函数调用: ()
2. 二进制和进制转换
2.1 什么是二进制、八进制、十进制、十六进制

2.1.1 二进制和进制转换
通俗来讲二进制、八 进制、 十进制、 十六进制是数值的不同表示形式而已。
比如:数值15的各种进制的表示形式:
15的2进制表现形式: 1111
15的8进制表现形式: 17
15的10进制表现形式: 15
15的16进制表现形式: F
//16进制的数值之前写:0x
//8进制的数值之前写:0
#include<stdio.h>
int main()
{printf("%d\n", 153);printf("%d\n", 0153);printf("%d\n", 0x153);return 0;
}

2.1.2 二进制转十进制
十进制的123表示的值是一百二十三 ,十进制的每一位是有权重的 ,十进制的数字从右向左是个位、十位、百位… ,分别每一位的权重是 100 , 101 , 102 …

二进制和十进制是类似的 ,只不过二进制的每—位的权重

十进制转二进制数字

进行转化的方法就是:这个数字%2,得到的余数写在一边,直到最后被除数为0时,再将数字从下往上抄上,这个数字即为十进制数字的二进制数
所以120转成二进制就是1111000
2.2.3 二进制转八进制
8进制的数字每一位是0 ~ 7的,0~7的数字,各自写成2进制,最多有3个二进制位就足够了,比如7的二进制是111 ,所以在二进制转八进制数的时候 ,从二进制序列中右边低位开始向左每3个二进制位会换算一 个八进制位 ,剩余不够3个二进制位的直接换算。
如:二进制的 01101011,换成八进制:0153,0开头的数字,会被当做八进制。
2.2.4 二进制转十六进制
十六进制的数字每一位是0 ~ 9,a ~ f 的,0~9,a ~ f的数字,各自写成二进制,最多有4个二进制位就足够了,比如 f 的二进制是1111,所以在二进制转十六进制数的时候,从二进制序列中右边低位开始向左每4个二进制位会换算一个十六进制位,剩余不够4个二进制位的直接换算。
如:二进制的01101011,换成十六进制:0x6b ,十六进制表示的时候前面加0x
3. 源码、反码、补码
整数的二进制表示方法有三种 ,即原码、反码和补码
有符号整数的三种表示方法均有符号位和数值位两部分,二进制序列中,最高位的1位是被当做符号位,剩余的都是数值位。
符号位都是用0表示“正” ,用1表示“负”。
负整数的原码、反码、补码表示方法各不相同。
原码:直接将数值按照正负数的形式翻译成二进制得到的就是原码。
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码:反码+1就得到补码。
注意:正数的原码、反码、补码相同。
补码得到原码也是可以使用:取反,+1的操作。
对于整形来说:数据存放内存中其实存放的是补码。
计算机中进行计算是使用补码,%d打印是用原码。
这是因为在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一 处理; 同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
#include<stdio.h>
int main()
{int a = 10;// a是整型,即a占4个字节(32bite)位// 00000000000000000000000000001010 -> a的原码// 00000000000000000000000000001010 -> a的反码// 00000000000000000000000000001010 -> a的补码int b = -10;// 10000000000000000000000000001010 -> b的原码// 11111111111111111111111111110101 -> b的反码// 11111111111111111111111111110110 -> b的补码return 0;
}

4. 移位操作符
左移操作符:<<
右移操作符:>>
注:移位操作符的操作数只能是整数。
4.1 左移操作符
移位规则:左边抛弃、右边补0
#include<stdio.h>
int main()
{int a = 10;int b = a << 1;printf("b = %d\n", b);printf("a = %d\n", a);return 0;
}


可以看到左移一位有乘以2的效果。
4.2 右移操作符
移位规则:首先右移运算分两种:
- 逻辑右移:左边用0填充,右边丢弃
- 算术右移:左边用原该值的符号位填充,右边丢弃

逻辑右移比较简单粗暴,直接在左边添0,显然,这会使得负数右移后变成正数。

算数右移与逻辑右移不同,它是在左边补原该值的符号位进行填充,不会出现负数右移变正数的情况。
#include<stdio.h>
int main()
{int a = -1;int b = a >> 1;printf("b = %d\n", b);printf("a = %d\n", a);return 0;
}

注意:右移是算数右移还是逻辑右移标准中没有规定,这是取决于编译器的。
5. 位操作符:&、|、^、~
位操作符有:
& //按位与
| //按位或
^ //按位异或
~ //按位取反
这里的位表示二进制位。
注:他们的操作数必须是整数。
5.1 按位与 &
在 C 语言中,按位与运算符用符号 & 表示。
按位与的规则是:两个操作数对应的的二进制位中都为1时,结果为1,否则为0。
这里我们直接上代码
#include<stdio.h>
int main()
{int a = 10;int b = -7;int c = a & b;printf("%d\n", c);return 0;
}


5.2 按位或 |
在 C 语言中,按位或运算符用符号 | 表示。
按位或的规则是:两个操作数对应的的二进制位中任何一个对应的位为1,那么结果中的该位就为 1;只有当两个操作数的对应位都为 0 时,结果中的该位才为 0。
#include<stdio.h>
int main()
{int a = 10;int b = -7;int c = a | b;printf("%d\n", c);return 0;
}


5.3 按位异或 ^
在 C 语言中,按位异或运算符使用符号 ^ 表示。
按位异或的规则是:两个操作数中的对应位相同(都为 0 或都为 1),则结果中的该位为 0;如果两个操作数中的对应位不同(一个为 0,一个为 1),则结果中的该位为 1。
#include<stdio.h>
int main()
{int a = 10;int b = -7;int c = a ^ b;printf("%d\n", c);return 0;
}


5.5 按位取反 ~
在 C 语言中,按位取反运算符使用符号 ~ 表示。
按位取反规则是:当对一个操作数进行按位取反运算时,其二进制表示中的每个位都会被反转(0 变成 1,1 变成 0)。
#include<stdio.h>
int main()
{int a = 10;int b = ~a;printf("%d\n", b);return 0;
}


相关文章:
【C语言基础】:操作符详解(一)
文章目录 操作符详解1. 操作符的分类2. 二进制和进制转换2.1 什么是二进制、八进制、十进制、十六进制2.1.1 二进制和进制转换2.1.2 二进制转十进制2.2.3 二进制转八进制2.2.4 二进制转十六进制 3. 源码、反码、补码4. 移位操作符4.1 左移操作符4.2 右移操作符 5. 位操作符&…...
通俗易懂分析:Vite和Webpack的区别
1、对项目构建的理解 先从浏览器出发, 浏览器是由浏览器内核和JS引擎组成;浏览器内核编译解析html代码和css代码,js引擎编译解析JavaScript代码;所以从本质上,浏览器只能识别运行JavaScript、CSS、HTML代码。 而我们在…...
OpenCart程序结构与业务逻辑
一、程序业务逻辑说明 在 OpenCart 中,index.php 文件是整个应用程序的入口文件,它负责初始化应用程序并调度请求。以下是 index.php 文件加载执行的流程: 1. **设置路径常量:** - index.php 首先定义了一些重要的路径常量&…...
软件License授权原理
软件License授权原理 你知道License是如何防止别人破解的吗?本文将介绍License的生成原理,理解了License的授权原理你不但可以防止别人破解你的License,你甚至可以研究别人的License找到它们的漏洞。喜欢本文的朋友建议收藏+关注,方便以后复习查阅。 什么是License? 在…...
C/C++实现老鼠走迷宫
老鼠形象可以辨认,可以用上下左右操纵老鼠;正确检测结果,若老鼠在规定的时间内走到粮仓,提示成功,否则提示失败。代码分为3个文件:main.cpp、play.h、play.cpp。 main.cpp: #include <iostream> #include <…...
[Linux]文件基础-如何管理文件
回顾C语言之 - 文件如何被写入 fopen fwrite fread fclose fseek … 这一系列函数都是C语言中对文件进行的操作: int main() {FILE* fpfopen("text","w");char str[20]"write into text";fputs(str,fp);fclose(fp);return 0; }而上…...
bat 查找文件所在
脚本 在批处理文件(.bat)中查找文件所在的目录,你可以使用dir命令结合循环和条件语句来实现。以下是一个简单的示例,演示如何在批处理文件中查找指定文件并输出其所在目录: echo off setlocal enabledelayedexpansio…...
程序员的守护神:为何电脑永不熄灭?
在这个信息时代,程序员成了推动社会进步的“隐形英雄”。他们通宵达旦,手指在键盘上跳跃,创造出一个个令人惊叹的数字世界。有趣的是,你可能注意到了一个现象:程序员似乎总是不关电脑。这并非他们对电脑上瘾࿰…...
Kafka快速实战以及基本原理详解
Kafka快速实战以及基本原理详解 基本概念 Kafka是一个分布式、支持分区、多副本,基于ZK的分布式消息系统,最大的特性就是可以实时的处理大量数据以满足各种需求场景,比如Hadoop的批处理系统、低延迟的实时系统、Storm/Spark流式处理引擎、日…...
微信小程序(4)- 事件系统和模板语法
1. 事件系统 1.1 事件绑定和事件对象 小程序中绑定事件与在网页开发中绑定事件几乎一致,只不过在小程序不能通过 on 的方式绑定事件,也没有 click 等事件,小程序中绑定事件使用 bind 方法,click 事件也需要使用 tap 事件来进行代…...
【Java多线程】对线程池的理解并模拟实现线程池
目录 1、池 1.1、线程池 2、ThreadPoolExecutor 线程池类 3、Executors 工厂类 4、模拟实现线程池 1、池 “池”这个概念见到非常多,例如常量池、数据库连接池、线程池、进程池、内存池。 所谓“池”的概念就是:(提高效率) 1…...
python连接mysql数据库
连接MySQL数据库,通常我们会使用Python的mysql-connector-python库。下面是一个基本的示例来展示如何使用Python连接到MySQL数据库。 首先,确保你已经安装了mysql-connector-python库。如果没有,你可以使用pip来安装它: pip ins…...
docker用法
首先需要去docker官网注册你的账号,记住账号名称和密码; 然后在本地执行: docker login登录OK。 把ubuntu下载到本地: sudo docker pull ubuntusudo docker images输出: REPOSITORY TAG …...
DIcom调试Planar configuration
最近和CBCT组同事调dicom图像 这边得图像模块老不兼容对方得dicom文件。 vtk兼容,自己写得原生解析不兼容。 给对方调好了格式,下次生成文件还会有错。 简单记录下,日后备查。 今天对方又加了 个字段:Planar configuration 查…...
C#与VisionPro联合开发——跳转页面
1、跳转页面并打开相机 From1 所有代码展示 using System; using System.IO; using System.Windows.Forms; //引入VisionPro命名空间 using Cognex.VisionPro;namespace ConnectCamera {public partial class Form1 : Form {public Form1() {InitializeComponent();}CogAcqFif…...
服务端测试开发必备技能:Mock测试
什么是mock测试 Mock 测试就是在测试活动中,对于某些不容易构造或者不容易获取的数据/场景,用一个Mock对象来创建以便测试的测试方法。 Mock测试常见场景 无法控制第三方系统接口的返回,返回的数据不满足要求依赖的接口还未开发完成&#…...
vue3中ref创建变量取值时自动补充 .value 插件 volar
插件 TypeScript Vue Plugin (Volar) 设置中配置...
clickhouse的docker部署与springboot整合
注意:镜像bitnami/clickhouse包含服务端和客户端,yandex版本需要使用yandex/clickhouse-server,yandex/clickhouse-server docker启动命令(允许空密码 -e ALLOW_EMPTY_PASSWORD=yes),clickhouse版本不同,配置文件在的位置也会不一样/etc/clickhouse-server/config.xml d…...
Node.js_基础知识(计算机硬件基础)
主机的基本组成 CPU:Central Processing Unit,即中央处理器,是计算机的核心部件。是一块集成电路芯片,能够执行计算机指令并控制计算机的各种操作,负责运算和处理数据内存:是电脑硬件中的一块电路板,用于暂时存储CPU中的运算数据,是计算机与CPU进行沟通的桥梁,负责存储…...
git bash :download.sh: line 1: wget: command not found(已解决)
Windows中git bash完全可以替代原生的cmd,但是对于git bash会有一些Linux下广泛使用的命令的缺失,比如wget命令。 1、下载wget.exe,地址:https://eternallybored.org/misc/wget/ 2、将wget.exe 拷贝到C:\Program Files\Git\ming…...
惊艳!Pi0具身智能v1动作轨迹可视化:关节控制曲线清晰呈现
惊艳!Pi0具身智能v1动作轨迹可视化:关节控制曲线清晰呈现 1. 具身智能的动作可视化革命 在机器人实验室里,工程师小李正盯着屏幕上一堆杂乱的数据点发愁——这是他们最新研发的机械臂在执行抓取任务时生成的关节角度数据。理论上这些数字应…...
Visual C++ Redistributable开源项目故障排除终极指南:从问题诊断到系统优化
Visual C Redistributable开源项目故障排除终极指南:从问题诊断到系统优化 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 开源项目故障排除是开发者…...
Spring AI实战:从零构建智能聊天与图像生成应用
1. Spring AI初探:你的第一个智能聊天应用 记得第一次接触AI聊天功能时,我盯着那个能对答如流的对话框看了足足十分钟。现在用Spring AI框架,只需要四步就能实现同样的效果。先创建一个标准的Spring Boot项目,这个不用多说&#x…...
Acode:重新定义Android移动代码编辑体验
Acode:重新定义Android移动代码编辑体验 【免费下载链接】Acode Acode - powerful text/code editor for android 项目地址: https://gitcode.com/gh_mirrors/ac/Acode 在移动开发日益普及的今天,拥有一款高效的移动代码编辑器成为开发者的迫切需…...
云效Codeup代码评审功能深度体验:如何用它提升团队代码质量(附真实项目案例)
云效Codeup代码评审实战指南:从规范制定到CI/CD集成 在当今快节奏的软件开发环境中,代码质量直接决定了产品的稳定性和可维护性。作为技术负责人,我经历过无数次因代码质量问题导致的深夜加班和紧急修复。直到团队开始系统化使用云效Codeup的…...
达摩院StructBERT中文相似度模型部署教程:Prometheus监控指标接入
达摩院StructBERT中文相似度模型部署教程:Prometheus监控指标接入 1. 项目概述 StructBERT中文相似度模型是阿里达摩院基于StructBERT大规模预训练模型开发的专业语义匹配工具。该模型通过强化语言结构理解能力,能够将中文句子转化为高质量的特征向量&…...
深入解析DHT11单总线通信:如何通过时序控制实现稳定数据传输?
1. DHT11单总线通信的基本原理 第一次用DHT11传感器时,我被它只用一根线就能传数据惊到了。这就像两个人打电话,不需要复杂的线路,只要一根电话线就能聊天气温湿度。DHT11采用的单总线协议(1-Wire Protocol)就是这样一…...
Vue与原生HTML页面无缝通信的iframe实现方案
1. 为什么需要Vue与原生HTML页面通信? 在实际开发中,我们经常会遇到这样的场景:一个Vue项目需要集成第三方提供的HTML页面,比如支付网关、地图服务、视频播放器等。这些页面通常都是独立开发的,使用原生HTML/JavaScrip…...
超越矩阵SVD:T-SVD如何用傅里叶变换搞定三维数据补全?一个视频修复案例讲透
超越矩阵SVD:T-SVD如何用傅里叶变换搞定三维数据补全?一个视频修复案例讲透 当一段珍贵的历史视频出现帧丢失或噪声污染时,传统矩阵分解方法往往束手无策——它们将三维视频数据强行"压扁"成二维矩阵进行处理,破坏了时空…...
别再问同步安全了!手把手教你用Docker部署思源笔记,并彻底搞懂它的端到端加密
从零构建安全笔记系统:Docker部署思源笔记与端到端加密实战指南 在信息爆炸的时代,如何安全地管理个人知识库成为技术爱好者的核心诉求。思源笔记作为一款支持Markdown的本地优先笔记工具,配合Docker容器化部署,能够打造真正私有化…...


