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

【初阶C语言】操作符1--对二进制的操作

前言:本节内容介绍的操作符,操作的对象是二进制位。所以前面先介绍整数的二进制位

一、二进制位介绍

1.二进制介绍

(1)整数的二进制表示形式有三种:原码、反码和补码。

(2)原码、反码和补码的长度有数据类型来决定,如整数,就是四个字节,转化后是三十二位比特位,所以一个整数写成二进制序列的时候,是32个bit位。

(3)数据是以补码的形式在内存中存储的。

(4)正负数原码、反码和补码不一样

2.正数三码的介绍

(1)正数的原码、反码和补码都一样,不需要计算,可以直接得出来。

(2)举例

7,我们先把7转化成二进制数:111;由于整数的二进制序列是32位,所以其他我需要补0,就写成这样

原码:00000000 00000000 00000000 00000111

反码:00000000 00000000 00000000 00000111

补码:00000000 00000000 00000000 00000111

3,二进制数为:11  二进制序列:

原码:00000000 00000000 00000000 00000011

反码:00000000 00000000 00000000 00000011

补码:00000000 00000000 00000000 00000011

3.负数三码的介绍

我们接下来重点介绍负数的原码、反码和补码

(1)原码

对于有符号的整数来说,最高位的一位是符号位;符号位是1表示负数,符号位是0表示正数。若是无符号数,没有符号位,所有位都是有效位。数字0则当成无符号数来看待。

正数:

负数:

对于有符号数来说,正负数原码的差异就是在最高位。

(2)反码

1.反码,顾名思义就是取反。

定义:反码是在原码的基础上,除了符号位,其他按位取反,1的话就写成0,0就写成1。

2.-7的反码

原码:10000000 00000000 00000000 00000111

反码:11111111  11111111   11111111  11111000

(3)补码

1.定义:补码则是在反码的基础上+1。

2.-7的补码

原码:10000000 00000000 00000000 00000111

反码:11111111  11111111   11111111  11111000

补码:11111111  11111111   11111111  11111001

而补码,就是数据在内存中的存储形式。所以整数在计算的时候使用的也是补码。

总结:三码的转换规则:原码----(取反)--->反码-----(+1)---->补码

补码----(-1)--->反码----(取反)--->原码

补码----(取反,+1)--->原码

二、移位操作符

前言:移位操作符包括左移操作符(<<)和右移操作符(>>)

1.左移操作符(<<)

(1)常用口诀:左边丢弃,右边补0

(2)代码演示

#include<stdio.h>
int main()
{int a = 7;int b = a << 1;//a向左移动一位printf("%d\n",a);//a的本质没有改变printf("%d\n",b);return 0;
}

代码结果:

由上面很清楚的就可以知道,其实a的值还是-7,没有改变。

代码演示2:

#include<stdio.h>
int main()
{int a = -7;//将a的值改成负数int b = a << 1;int c = a << 2;printf("%d\n",a);printf("%d\n",b);printf("%d\n",c);return 0;
}

运行结果:

两次代码演示初步总结:左移一位,结果在原数据基础上×2;左移两位,结果在原数据基础上×3;但原数据的值不会改变。

(3)左移符号解析

左移符号,移动的是补码,但是打印的时候打印的是原码。

正数左移:7

原码:00000000 00000000 00000000 00000111

反码:00000000 00000000 00000000 00000111

补码:00000000 00000000 00000000 00000111

正数的左移比较容易看出来,因为原码、反码和补码都相同

负数右移:-7

原码:10000000 00000000 00000000 00000111

反码:11111111  11111111   11111111  11111000

补码:11111111  11111111   11111111  11111001

总结:

    无论正数还是负数,左移的结果都会×2。

记忆口诀:左边丢弃,右边补0。

2.右移操作符(>>)

(1)右移操作符分类

右移操作符包括:算术右移和逻辑右移

逻辑右移:右边直接丢弃,左边补0

算术右移:右边直接丢弃,左边补原符号位(正数补0,负数补1)-----------常用选择

 我们下面的例子也都用算术右移来演示

(2)代码演示

#include<stdio.h>
int main()
{int a = 10;int b = a >> 1;printf("%d\n", a);printf("%d\n", b);int c = -10;int d = c >> 1;printf("%d\n", c);printf("%d\n",d);return 0;
}

运行结果:

其实不难发现,算术右移其实也有一种÷2的效果。

(3)右移图示解析

 

总结:大多数编译器都是使用算术右移,效果相当于÷2

算术右移口诀:右边丢弃,左边补原符号位

3.左移、右移总结

(1)移动的对象只能是整数

(2)只能移动正整数位,比如左移一位、右移两位。

(3)移动后不会改变原数据的值

(4)移动的是二进制的补码,打印的结果是二进制的原码

三、位操作符

前言:位操作符的对象仍然是二进制的补码,他们必须有两个操作对象

1.按位与(&)

(1)定义

两个对象的补码比较,相同位有0则结果位0,相同位都是1结果才为1。

 (2)代码演示

#include<stdio.h>
int main()
{int a = 5;int b = 7;int c = a & b;//将按位与的结果赋值给cprintf("%d\n",c);return 0;
}

 运行结果:

(3)代码分析

我们先列出5和7的补码:

5的补码:00000000 00000000 00000000 00000101

7的补码:00000000 00000000 00000000 00000111

图解:

(4)实列讲解

根据有0为0,两个1才为1的特点,可以按位与1来确定最低一位(最右一边)是1或者0。

代码演示:

#include<stdio.h>
int main()
{int a = 3;int b = a & 1;printf("%d\n",b);return 0;
}

运行结果:

 结果分析:

3的补码:00000000 00000000 00000000 00000011

1的补码:00000000 00000000 00000000 00000001

所以,任何数按位与1,得出的结果为1,则该数的二进制最低为是1,如果是0,则最低为是0。当然,要知道该数的二进制序列的所以1,则需要配合右移符号使用(后续补充)

2.按位或(|)

(1)定义

二进制序列对应位上,有1则为1,两个相同才为0。

(2)代码演示

#include<stdio.h>
int main()
{int a = 5;int b = -3;int c = a | b;//按位或printf("%d\n",c);return 0;
}

 运行结果:

(3)代码解读

5的补码:00000000 00000000 00000000 00000101

-3的补码:11111111 11111111 11111111 11111101

3.按位异或(^)

(1)定义

对应的二进制位相同为0,相异为1

由此而来的知识点:a^a=0          a^0=a

(2)代码演示

#include<stdio.h>
int main()
{int a = 5;int b = -3;int c = a ^ b;//按位异或printf("%d\n", c);return 0;
}

运行结果:

(3)代码解读

5的补码:00000000 00000000 00000000 00000101

-3的补码:11111111 11111111 11111111 11111101

 

(4)实例讲解

题目:在不借助第三方变量的情况下,交换两个变量的值

代码演示:

#include<stdio.h>
int main()
{int a = 520;int b = 1314;a = a ^ b;b = a ^ b;//此时的a=a^ba = a ^ b;printf("a=%d b=%d\n",a,b);return 0;
}

运行结果:

代码解读:

第一步:a=a^b;这个结果先不要算出来

第二步:b=a^b;这个时候左边的a=a^b,所以整个等式变成b=a^b^b,因为b^b=0,且a^0=a,所以此时就将a的值赋给了b,

第三步:a=a^b,此时左边的a=a^b,b=a,所以左边=a^b^a=b,所以就将b赋值给了a,完成两个数的交换

 

四、某些复合赋值操作符和一个单目操作符

前言:操作对象都是二进制的补码

1.复合赋值操作符

(1)赋值操作符的介绍

>>=    右移等
<<=    左移等
&=      按位与等
|=       按位与等
^=      按位异或等

 (2)使用方法

上面的这些符号就多了一个等号,就如同+=一样

代码举例:

#include<stdio.h>
int main()
{int a = 5;a = a >> 1;//普通写法a >>= 1;//复合写法a = a << 1;a <<= 1;a = a & 2;a &= 2;//复合写法a = a | 4;a |= 4;a = a ^ 1;a ^= 1;return 0;
}

2.一个单目操作符

(1)定义:~(一个波浪号)

作用:对一个数的二进制按位取反

(2)代码演示

#include<stdio.h>
int main()
{int a = 0;printf("%d\n",~a);//单目操作符return 0;
}

运行结果:

(3)例子

#include<stdio.h>
int main()
{int a = 10;a |= (1 << 4);//控制二进制将10变成26printf("%d\n",a);//再将26变回10a &= (~(1 << 4));printf("%d\n",a);return 0;
}

10的补码:00000000 00000000 00000000 00001010

26的补码:00000000 00000000 00000000 00011010

 10变成26:

 26变回10:只需将该位置按位与上0即可


相关文章:

【初阶C语言】操作符1--对二进制的操作

前言&#xff1a;本节内容介绍的操作符&#xff0c;操作的对象是二进制位。所以前面先介绍整数的二进制位 一、二进制位介绍 1.二进制介绍 &#xff08;1&#xff09;整数的二进制表示形式有三种&#xff1a;原码、反码和补码。 &#xff08;2&#xff09;原码、反码和补码的…...

安装pyscipopt

安装pyscipopt Conda会自动安装SCIP&#xff0c;因此所有内容都可以通过单个命令安装&#xff1a; GitHub - scipopt/PySCIPOpt: Python interface for the SCIP Optimization Suite conda create --name myenv python3.8 # 创建新环境 conda activate myenv # 激活新环境 …...

原生js实现的轮盘抽奖案例

来到大学也是有二年了&#xff0c;吃饭最多的地方就是在食堂&#xff0c;经过这么久的时间&#xff0c;已经几乎是把每个窗口的菜都吃腻了&#xff0c;所以我打算做个轮盘抽奖的形式来决定我每天要吃些什么。 目录 实现效果图&#xff1a; 静态搭建 js代码 1.实现此功能的思路…...

最经典的解析LSA数据库(第六课)

初步认识OSPF的大致内容(第三课)_IHOPEDREAM的博客-CSDN博客 1 OSPF 工作过程 建立领居表 同步数据库 今天来 说一说数据库概念 计算路由表 2 什么是数据库&#xff1f; 数据库是一个组织化的数据集合&#xff0c;用于存储、管理和检索数据。它是一个可访问的集合&#x…...

C++基础入门

文章目录 前言一、C历史及发展1.C是什么2.C历史 二、开始C1.基础类型1.第一个简单的C程序2.命名空间1.命名空间的介绍2.命名空间的使用3.命名空间的using声明与using指示 3.初识输入输出操作4.引用1.引用概念2.引用的使用1.引用做参数2.引用做返回值 3.引用和指针的区别4.const…...

【每日随笔】驾驭人性 ② ( 员工立场问题 | 立场转变 | 吴越同舟 | 老板如何与员工结成利益共同体 )

文章目录 一、员工立场问题二、立场转变三、吴越同舟四、老板如何与员工结成利益共同体 一、员工立场问题 人的潜力是很大的 , 肩上抗 100 斤 水泥 和 肩上抗 100 斤黄金 , 能一样吗 , 扛着黄金绝对能扛回家 ; 员工 不愿意 与公司一条心是正常的 , 员工 拿的是 死工资 , 公司赚…...

C++(QT)画图行车

通过鼠标在窗口上点击形成多个点的连线&#xff0c;绘制一辆汽车沿着绘制的连线轨迹前进。要求连线点数大于20.可以通过清除按钮清除已经绘制的连线&#xff0c;并可以重新绘制一条轨迹连线。当车辆行驶到轨迹终点时&#xff0c;自动停止。&#xff08;汽车实在可用方块代替&am…...

Unity中Shader抓取屏幕并实现扭曲效果(优化)

文章目录 前言一、在之前顶点着色器的输入中&#xff0c;放弃了使用结构体传入&#xff0c;而是直接从应用程序阶段传入参数&#xff0c;这样写的话&#xff0c;对于程序来说&#xff0c;不方便扩张&#xff0c;所以需要对其进行修改实现1、定义结构体用于传入顶点坐标系2、因为…...

肖sir__设计测试用例方法之_(白盒测试)

白盒测试技术 一、定义&#xff1a; 白盒测试也叫透明盒测试&#xff0c;检查程序内部结构及路径一是否符合规格说明&#xff0c;二是否符合其代码规范。 因此&#xff0c;也叫结构测试或者逻辑驱动测试。 二、白盒测试常见方法&#xff1a; a、语句覆盖&#xff1b; b、判断覆…...

GoT:用大语言模型解决复杂的问题

GoT&#xff1a;用大语言模型解决复杂的问题 摘要介绍背景和符号表示语言模型和上下文学习Input-Output&#xff08;IO&#xff09;Chain of thought&#xff08;CoT&#xff09;Multiple CoTTree of thoughts&#xff08;ToT&#xff09; GoT框架推理过程思维变换聚合变换&…...

nginx服务和uwsgi服务如何设置开机自启动

上次学到了在云服务器下如何部署Django项目&#xff0c;用到了nginx服务和uwsgi服务&#xff0c;需要手工启动这2个服务的命令。 现在考虑如何设置开机自启动&#xff0c;为什么要这样考虑&#xff1f;因为服务器万一出问题&#xff0c;意外重启了&#xff0c;那我们部署的Dja…...

算法-分治算法

文章来源&#xff1a; https://blog.csdn.net/weixin_45630258/article/details/126425400 欢迎各位大佬指点、三连 一、分治 1、定义&#xff1a;分治&#xff0c;也就是分而治之。 它的一般步骤是&#xff1a; ① 将原问题分解成若干个规模较小的子问题&#xff08;子问题…...

react 实现监听逻辑

需求&#xff1a; 在一个页面下有多个子tab在某些tab 下&#xff0c;或者父节点的数据更新的时候&#xff0c;其他子tab 或者父节点也要同步更新 进程&#xff1a; 正常情况下会把所有用到的数据都移动到父节点&#xff0c;修改行为也都放在父节点但如果这样的话父节点的数据…...

vue项目一个页面包含多个时间选择器的处理方案

描述&#xff1a;vue项目中如果在一个页面使用多个时间选择器组件时&#xff0c;不同的时间选择器需要分别分开工作 解决方案一 原本是想直接每一个时间选择器都安排一套相对独立的维生系统&#xff0c;但是到后面发现繁琐至极&#xff0c;而且报错&#xff0c;果断放弃&#…...

机器学习入门教学——决策树

1、简介 决策树算法是一种归纳分类算法&#xff0c;它通过对训练集的学习&#xff0c;挖掘出有用的规则&#xff0c;用于对新数据进行预测。决策树算法属于监督学习方法。决策树归纳的基本算法是贪心算法&#xff0c;自顶向下来构建决策树。 贪心算法&#xff1a;在每一步选择…...

文献阅读:Chain-of-Thought Prompting Elicits Reasoning in Large Language Models

文献阅读&#xff1a;Chain-of-Thought Prompting Elicits Reasoning in Large Language Models 1. 文章简介2. 具体方法3. 实验结果 1. 数学推理 1. 实验设计2. 实验结果3. 消解实验4. 鲁棒性考察 2. 常识推理 1. 实验设计2. 实验结果 3. 符号推理 1. 实验设计2. 实验结果 4.…...

从零开发一款ChatGPT VSCode插件

‍本文作者是360奇舞团开发工程师 引言 OpenAI发布了ChatGPT&#xff0c;就像是给平静许久的互联网湖面上扔了一颗重磅炸弹&#xff0c;刹那间所有人都在追捧学习它。究其原因&#xff0c;它其实是一款真正意义上的人工智能对话机器人。它使用了深度学习技术&#xff0c;通过大…...

go基础09-Go语言的字符串类型

字符串类型是现代编程语言中最常使用的数据类型之一。在Go语言的先祖之一C语言当中&#xff0c;字符串类型并没有被显式定义&#xff0c;而是以字符串字面值常量或以’\0’结尾的字符类型&#xff08;char&#xff09;数组来呈现的&#xff1a; #define GOAUTHERS "Rober…...

【C++模拟实现】手撕AVL树

【C模拟实现】手撕AVL树 目录 【C模拟实现】手撕AVL树AVL树的介绍&#xff08;百度百科&#xff09;AVL树insert函数的实现代码验证是否为AVL树AVL树模拟实现的要点易忘点AVL树的旋转思路 作者&#xff1a;爱写代码的刚子 时间&#xff1a;2023.9.10 前言&#xff1a;本篇博客将…...

如何重置 docker中的mariadb的root

停止 Mariadb 容器&#xff1a;运行以下命令停止正在运行的 Mariadb 容器&#xff1a; docker stop <container_name>将 <container_name> 替换为你的 Mariadb 容器的名称或容器ID。 删除 Mariadb 容器&#xff1a;运行以下命令删除已停止的 Mariadb 容器&#x…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

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

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

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

git: early EOF

macOS报错&#xff1a; Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...