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

news/2024/5/19 16:24:37


目录

前言

一、原码、反码、补码

二、移位操作符

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

四、经典例题分析:

总结


前言

        本文将详细介绍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. 这样这题就结束了


总结

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


http://www.mrgr.cn/p/08584848

相关文章

如何查找Lenovo XClarity Controller 的 MIB 文件

描述 本文介绍了为运行Lenovo XClarity Controller (LXCC) 的Lenovo服务器查找和下载 MIB 文件的过程。 程序转至数据中心支持。 lenovo .com 。 在搜索栏中,输入Lenovo服务器型号名称,然后单击自动搜索结果中正确服务器下的“下载” 。注意:在此示例中,将使用 SR650。 在“…

直播话术核心逻辑,学了轻松提高销量!沈阳直播运营培训

直播话术到底该怎么说&#xff1f; 产品话术说得好&#xff0c;直播间一次就能卖出去上万件产品&#xff1b;产品话术说不好&#xff0c;直播间半个月也卖不出去10件产品。 我们上次就有跟大家说过产品话术的具体流程&#xff0c;但发现还有更多朋友居然还是不能够很好地完成一…

allure功能使用-添加链接linktestcaseissue

1.执行指定测试用例时,在测试方法前添加注解@allure.link跳转到执行地址: 在HTML报告可看到跳转信息: 2.执行指定测试用例时,需要知道测试案例所在代码仓库地址时,在其方法前添加注解@allure.testcase跳转仓库地址(用于代码走读): 3.执行指定测试用例时,需要将该用例…

云原生周刊:Terraform 1.8 发布 | 2024.5.6

开源项目推荐 xlskubectl 用于控制 Kubernetes 集群的电子表格。xlskubectl 将 Google Spreadsheet 与 Kubernetes 集成。你可以通过用于跟踪费用的同一电子表格来管理集群。git-sync git-sync 是一个简单的命令,它将 git 存储库拉入本地目录,等待一段时间,然后重复。当远程…

OpenCV如何实现背投(58)

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV直方图比较(57) 下一篇&#xff1a;OpenCV如何模板匹配(59) 目标 在本教程中&#xff0c;您将学习&#xff1a; 什么是背投以及它为什么有用如何使用 OpenCV 函数 cv::calcBackP…

JAVA------基础篇

java基础 1.JDK JDK :java development kit JRE&#xff1a;java runtime environment JDK包含JRE java跨平台&#xff1a;因为java程序运行依赖虚拟机&#xff0c;虚拟机需要有对应操作系统的版本&#xff0c;而jre中有虚拟机。 当你想要在Linux系统下运行&#xff0c;则需要…

关于Docker的数据管理

文章目录 一、Docker的数据管理1、数据卷1.1 数据卷定义1.2 数据卷配置 2、数据卷容器2.1 创建数据卷容器2.2 使用--volume-from来挂载luck02 二、端口映射三、容器互联1、创建容器互联2、进入luck02测试&#xff08;ping 容器名/别名&#xff09; 四、Docker镜像的创建1、基于…

二叉树进阶:二叉搜索树、平衡二叉树、KD树(实现KNN算法的快速寻找k个邻居)

二叉搜索树二叉搜索树又称为二叉排序树、二叉查找树。请记住,本篇所介绍的所有树,都是二叉搜索树,也就是说都用到了二分查找的思想。二叉搜索树的特征:每个结点的左结点都小于结点本身,右结点都大于结点本身。用中序遍历来遍历一棵二叉搜索树,结果必然是有序的。 时间复杂…

岩土工程监测中振弦采集仪的布设方案及实施步骤简析

岩土工程监测中振弦采集仪的布设方案及实施步骤简析 岩土工程监测中,河北稳控科技振弦采集仪是一种常用的地下水位和土层压缩性监测工具。它通过采集振弦的振动信号来确定地下水位和土层的压缩性,为岩土工程的设计、施工和监测提供重要的数据支持。下面将对振弦采集仪的布设方…

活动回放 | 如何进行全增量一体的异构数据库实时同步

如何在不影响并保持现有业务系统正常运转的前提下,实现数据向新业务系统的持续同步,并保障异构数据同步的完整性、准确性、一致性、时效性。以 AI 领域为代表的新技术不断涌现,新的应用风口也逐渐清晰。为了加紧跟上技术发展的步伐,越来越多的企业开始着手,对仍以传统关系…

使用XPTable控件展示多窗口数据(XPTable控件使用说明七)

我给我的应用程序找到一个新的能力&#xff0c;因为有DEMO程序界面有6个窗口&#xff0c;我使用了2个显示器&#xff0c;一起来显示。

(前++) 和 (后++)的练习题

打印也是一种运算,因此是先打印出5,再-1。每天进步一点点,快乐生活多一点。

编程入门(六)【Linux系统基础操作一】

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 文章目录 &#x1f525;前言&#x1f680;Linux操作系统介绍与环境准备Linux操作系统介…

LVS/NAT工作模式介绍及配置

1.1 LVS/NAT模式工作原理 LVS&#xff08;Linux Virtual Server&#xff09;的网络地址转换&#xff08;NAT&#xff09;模式是一种在网络层&#xff08;第四层&#xff09;实现负载均衡的方法。在NAT模式中&#xff0c;Director Server&#xff08;DS&#xff09;充当所有服务…

11.IO 流

1.IO 流引入 概述:以应用程序为参照物,读取数据为输入流(Input),写数据为输出流(Output),大量输入输出数据简称 IO 流 原理:2.IO 流的分类 读写的文件分类二进制文件:打开后是乱码,或者是 16 进制,无法生成文件的文件 文本文件:打开文件内容可以直接阅读IO流读取数…

人大金仓数据库使(cai)用(keng)记录

最近一直在用人大金仓做项目,相关的文档相比其它流行的所谓“主流”数据库来说还是少了点,记录一些开发过程中遇到的问题。 1.数据库的模式(database_mode)在实例创建后就确定好了的,不可更改。想要改变模式只能重新init一个实例。oracle 模式下,实例目录下kingbase.conf…

【千帆平台】使用AppBuilder三步手搓应用创建精准多轮对话agent之K12互动式练习题

欢迎来到《小5讲堂》 这是《千帆平台》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言创建应用应用头像应用名称应用描述角色指令能力扩展开场白 …

关于聊天机器人的阅读笔记

目录智能对话机器人的类型知识问答机器人任务型对话机器人闲聊机器人 智能对话机器人的类型 知识问答机器人 主要应用场景包括智能客服、政务咨询、知识获取等 其主要实现方式是预定义大量的问题和答案存储在知识库中,当用户发送问题时,该程序会对该问题和知识库的问题进行对…

在Mac上恢复已删除文件夹的最佳方法

“嗨&#xff0c;我从我的Mac Documents文件夹中删除了很多文件夹。已删除的文件夹包含我的重要文档和文件&#xff0c;是否可以取回它们&#xff1f;垃圾桶已被清洁软件清空。如何在我的Mac上恢复已删除的文件夹&#xff1f; 当您在 Mac 上删除 1 或 2 个文件夹时&#xff0c…

问题管理员的工作角色、职责和技能

问题管理就是识别、分析和解决反复出现的根本原因问题并永久修复它们。听起来很简单对吧,不幸的是,情况并非总是如此。对于组织来说,IT问题管理一直是一门棘手的 ITSM 学科。一个经常被忽视的关键因素是有效的问题 管理不仅仅是工具和流程。 它需要熟练的人来带路 问题管理员…