当前位置: 首页 > 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…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...