C语言之位操作符:<<、>>、、|、^、~,以及原码反码补码和例题详解


目录

前言

一、原码、反码、补码

二、移位操作符

三、位操作符:&、|、^、~

四、经典例题分析:

总结


前言

        本文将详细介绍C语言中左移操作符<<,右移操作符>>,按位与&,按位或|,按位异或^,按位取反~这六种有关二进制位运算的操作符,为此本文还会介绍整数的原码、反码、补码,后面还有一些经典例题算法,以此来更好的理解这六种操作符,希望对大家有所帮助


一、原码、反码、补码

(注:因涉及二进制以及进制转换,不了解的需先了解二进制和进制转换)

C语言位操作符的操作数都为整数,准确的说是整数的二进制数,而补码才是一个整数真正存储在内存中的形式,以下的操作符也都是作用在补码上

整数有正负之分:

  • 正整数的原、反、补码都相同。
  • 负整数的三种表示方法各不相同。

原码:直接将数值按照正负数的形式翻译成二进制得到的就是原码。

反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。

补码:反码+1就得到补码。

我们看下图:

(注:整形占4个字节,一个字节占8个比特位,所用一个整形占32个比特位)

负整数转换规则记忆技巧:

  • 原码到补码:取反,+1。                                      
  • 补码到原码:也是取反,+1。也可以先-1到反码,再取反到原码,结果是一致的

对于整形来说:数据存放内存中其实存放的是补码。

为什么呢?

在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路

我们可以验证一下,其实用原码计算是得不到准确结果的,补码计算才能得到准确的结果


二、移位操作符

  • << 左移操作符
  • >> 右移操作符

注:移位操作符的操作数只能是整数

1.左移操作符 <<

移位规则:左边抛弃、右边补0 (注:是将整数的补码左移)

语法:整数<<移动位数

我们用上面的14和-9举例:

然后我们画图分析:

通过计算分析,结果一致

总之,左移就记住:左边抛弃,右边补0(补码)


2.右移操作符 >>

移位规则:首先右移运算分两种:

1. 逻辑右移:左边用0填充,右边丢弃

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

语法:整数>>移动位数

那么,右移操作符有两种规则怎么用,其实,绝大多数编译器使用的是算术右移,所以我们一般也是使用算术右移

还是用14和-9举例

画图分析:

通过计算分析:结果一致,使用的是算术右移

算术右移:左边用原该值的符号位填充,右边丢弃(补码)


三、位操作符:&、|、^、~

它们的操作数必须为整数,并且是作用于补码

1.按位与 &

规则:当两个相应的二进制位都是1时,结果位才是1,否则,结果位为0

简述:都为1则为1,否则为0

语法:整数&整数

我们看代码:

继续画图分析:

计算分析与结果一致

所以,&:只有相同位置都为1,才是1,否则就是0


2.按位或 |

规则:如果两个相应的二进制位中至少有一个为1,结果位为1,如果都是0,结果位为0

简述:有1则为1,否则为0

语法:整数 | 整数

我们看代码:

继续画图分析:

计算分析与结果一致

所以,|:相应位有1就是1,否则就是0


3.按位异或 ^

规则:如果两个相应的二进制位不同,则结果位为1,如果相同,则结果位为0

简述:相异为1,相同为0

语法:整数^整数

我们看代码:

继续画图分析:

计算分析与结果一致

所以,^:对应位相异为1,相同为0


4.按位取反 ~

规则:与字面意思一致,把二进制位的每一位1变为0,0变为1

语法:~整数

这个比较简单,并且是单目操作符

但是需要注意的是:符号位也会被取反

看代码:

分析:

计算分析与结果一致

需注意的是符号位也会改变


四、经典例题分析:

1.不创建变量,交换两个整数值

我们平时交换两个整数一般采用创建一个变量,当做中间量来交换两个整数,现在不允许创建一个变量,我们因该怎么做呢?

首先我们需要了解按位异或^的一些计算规律:

假如整形a和b,那么它们满足以下规律:

  • a^a=0
  • 0^a=a
  • a^b^a=b(交换律,即先计算a^a=0,再计算0^b=b)

我们简单验证一 a^a=0:很明显,两个相同的数二进制位肯定相同,按位异或就为0

验证 0^a=a:

验证 a^b^a=b;

规律都验证成功

因此这个代码我们可以这样写:使用交换律


2.计算整数二进制中有多少个1

关于这个问题有多种解法,这里主要介绍"Brian Kernighan算法"n&(n-1)

定义一个整数变量n,通过不断将输入数字n与n-1进行按位与&运算,每次运算都会消除n最右边的一个1,直到n变为0。

直接上代码:

画图分析:

每次运算都减去了最右边的一个1,直至减为0,计算非常高效,这是一个非常巧妙的算法,非常值得我们学习


3.改变13的二进制位第5位,并再改回来

分析:

  1. 首先13的二进制为:00000000000000000000000000001101
  2. 我们需要把从右至左的第五位改为1,因此我们可以采用按位或
  3. 而如何得到这个第5位为1其余数为0的这个二进制数呢?其实我们只需要把1<<4就行了,这样就得到了00000000000000000000000000010000
  4. 现在如何改回去呢?就像知道规律破译密码一样
  5. 需要还原的话,我们就需要改变第五位的1为0,我们可以使用按位与&
  6. 按位与11111111111111111111111111101111,那么这个二进制数如何得到呢?其实只需要000000000000000000010000这个数按位取反~就行
  7. 这样这题就结束了


总结

        以上就是本文关于位运算符的全部内容了,希望对大家有所帮助,有问题可以评论区提出,谢谢大家的支持

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/590009.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【QT学习】14补充,使用线程制作绘图工具

思路&#xff1a; 结果&#xff1a; 点击刷新图片&#xff0c;自动绘制一个六点连接图 线程类的属性 线程类的函数实现 void MyThread::drawImage(){//Qimage设备QImage image(600,600,QImage::Format_ARGB32);//画家QPainter p(&image);//画笔&#xff0c;画刷QPen pen;pe…

进位计数制

目录 前言 最古老的计数方法 十进制数 推广:r 进制计数法 任意进制->十进制 二进制<->八进制,十六进制 十进制->任意进制 真值和机器数 总结: 前言 本篇文章我们正式进入第二章:数据的表示和运算,通过第一章的学习我们知道了现代计算机的结构 那数据如何…

基于php+mysql+html图书管理系统(含实训报告)

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、Php、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…

自然语言处理 (NLP) 中的迁移学习

--懂王 在大数据高速发展的时代&#xff0c;AI的发展日新月异&#xff0c;充满挑战的迎接未来。 自然语言处理 (NLP) 中的迁移学习: 迁移学习在 NLP 中越来越受欢迎&#xff0c;特别是在数据稀缺的情况下。如何有效地利用预训练的语言模型&#xff0c;并将其迁移到新的任务和领…

kubectl_入门_service详解

Service 我们知道 Pod 的生命周期是有限的。可以用 ReplicaSet 和Deployment 来动态的创建和销毁 Pod&#xff0c;每个 Pod 都有自己的 IP 地址&#xff0c;但是如果 Pod 重建了的话那么他的 IP 很有可能也就变化了。 这就会带来一个问题&#xff1a;比如我们有一些后端的 Po…

基于Springboot的教学资源共享平台(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的教学资源共享平台&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

【Cpp】类和对象#构造函数 析构函数

标题&#xff1a;【Cpp】类和对象#构造函数 析构函数 水墨不写bug &#xff08;图片来源于网络&#xff09; 正文开始&#xff1a; &#xff08;一&#xff09;构造函数 构造函数是特殊的成员函数&#xff0c;需要注意的是&#xff0c;构造函数虽然名称叫构造&#xff0c;但…

nginx变量自定义日志收集

内置变量 $remote_addr&#xff1b;存放了客户端的地址&#xff0c;注意是客户端的公网IP&#xff0c;也就是一家人访问一个网站&#xff0c;则会显示为路由器的公网IP。 $args&#xff1b;变量中存放了URL中的指令 [rootlocalhost conf.d]# cat pc.conf server {listen 80;se…

数组的扩容与缩容

数组的扩容与缩容 文章目录 数组的扩容与缩容数组的扩容内存分析 数组的缩容内存分析内存分析 数组的扩容 数组扩容是指当原有数组的空间不足以容纳更多的元素时&#xff0c;创建一个新的、长度更大的数组&#xff0c;并将原数组中的元素复制到新数组中&#xff0c;然后更新原…

C++入门第二节--关键字、命名空间、输入输出

点赞关注不迷路&#xff01;本节涉及c入门关键字、命名空间、输入输出... 1. C关键字 C总计63个关键字&#xff0c;C语言32个关键字 asmdoifreturntrycontinueautodoubleinlineshorttypedefforbooldynamic_castintsignedtypeidpublicbreakelselongsizeoftypenamethrowcaseen…

如何完全卸载QT

第一步&#xff0c;用QT自带的软件卸载QT 第二步&#xff0c;卸载下面路径的所有QT配置 C:用户/(你的用户)/AppData/Local/目录下所有与Qt相关内容 C:用户/(你的用户)/AppData/Local/Temp/所有与Qt相关内容 C:用户/(你的用户)/AppData/Roaming/所有与Qt相关内容

C 深入指针(2)

目录 1 野指针 1.1 成因 1.2 如何规避野指针 2 assert 断言 2.1 用法 2.2 assert 的优点 2.1 assert 的缺点 3 小注解 3.1 Debug 和 Release 1 野指针 【概念】&#xff1a; 野指针就是指针指向的位置是不可知的&#xff08;随机的、不正确的、没有明确限制的&#…

场景文本检测识别学习 day06(Vi-Transformer论文精读、MAE论文阅读)

Vi-Transformer论文精读 在NLP领域&#xff0c;基于注意力的Transformer模型使用的非常广泛&#xff0c;但是在计算机视觉领域&#xff0c;注意力更多是和CNN一起使用&#xff0c;或者是单纯将CNN的卷积替换成注意力&#xff0c;但是整体的CNN 架构没有发生改变VIT说明&#x…

与 Apollo 共创生态:企业解决方案Apollo X 9.0,七载同舟,携手远航,视频简说

目录 介绍背景方案与项目Apollo 开源项目Apollo X 企业解决方案落地因素助力企业落地流程 预置套件需求定义功能定义场景用例融合技术面向园区功能安全Cyber RT企业硬件套件 开发工具链研发迭代范式协同研发工具链标定工具地图工具仿真平台数据闭环 企业合作模式合作方式 共创计…

[初阶数据结构】时间复杂度与空间复杂度

前言 &#x1f4da;作者简介&#xff1a;爱编程的小马&#xff0c;正在学习C/C&#xff0c;Linux及MySQL。 &#x1f4da;本文收录于初阶数据结构系列&#xff0c;本专栏主要是针对时间、空间复杂度&#xff0c;顺序表和链表、栈和队列、二叉树以及各类排序算法&#xff0c;持续…

nuxt3使用记录六:禁用莫名其妙的Tailwind CSS(html文件大大减小)

发现这个问题是因为&#xff0c;今天我突然很好奇&#xff0c;我发现之前构建的自动产生的200.html和404.html足足290k&#xff0c;怎么这么大呢&#xff1f;不是很占用我带宽&#xff1f; 一个啥东西都没有的静态页面&#xff0c;凭啥这么大&#xff01;所以我就想着手动把他…

ICode国际青少年编程竞赛- Python-1级训练场-基础训练2

ICode国际青少年编程竞赛- Python-1级训练场-基础训练2 1、 a 4 # 变量a存储的数字是4 Dev.step(a) # 因为变量a的值是4&#xff0c;所以Dev.step(a)就相当于Dev.step(4)2、 a 1 # 变量a的值为1 for i in range(4):Dev.step(a)Dev.turnLeft()a a 1 # 变量a的值变为…

未来科技的前沿:深入探讨人工智能的进展、机器学习技术和未来趋势

文章目录 一、人工智能的定义和概述1. 人工智能的基本概念2. 人工智能的发展历史 二、技术深入&#xff1a;机器学习、深度学习和神经网络1. 机器学习2. 深度学习3. 神经网络 三、人工智能的主要目标和功能1. 自动化和效率提升2. 决策支持和风险管理3. 个性化服务和预测未来 本…

DHCPv4_CLIENT_ALLOCATING_01: 在其本地物理子网上广播DHCPDISCOVER消息

测试目的&#xff1a; 确保客户端能够在其本地物理子网上广播DHCPDISCOVER消息。 描述&#xff1a; 该测试用例旨在验证DHCP客户端是否能够正确地在其本地物理子网上广播DHCPDISCOVER消息&#xff0c;以便进行IP地址的自动分配。 测试拓扑&#xff1a; 测试步骤&#xff1a…

机器学习:深入解析SVM的核心概念【三、核函数】

核函数 **问题一&#xff1a;为什么说是有限维就一定存在高维空间可分呢&#xff1f;**原始空间与特征空间为什么映射到高维空间可以实现可分核函数的作用 **问题二&#xff1a;最终怎么得到函数**从对偶问题到决策函数的步骤&#xff1a;结论 **问题三&#xff1a;为什么说特征…