C++位运算符(<<,>>,|,^,)

news2024/9/20 14:34:35

简介

位运算符作用于整数类型的运算对象,并把运算对象看成是二进制位的集合。位运算符提供检查和设置二进制位的功能,一种名为bitset的标准库类型也可以表示任意大小的二进制集合,所以位运算符同样可以用于bitset类型。

  1. 如果运算对象是“小整型”,则它的值会被自动提升成较大的整数类型。运算对象可以是带符号的,也可以是无符号的。
  2. 如果运算对象是带符号的且它的值为负,那么位运算符如何处理运算对象的“符号位”依赖于机器。而且,此时的左移操作可能会改变符号位的值,因此是一种未定义的行为。

关于符号位如何处理没有明确的规定,所以强烈建议仅将位运算符用于处理无符号类型。

移位运算符

<<和>>这两种运算符的内置含义是对其运算对象执行基于二进制位的移动操作,首先令左侧运算对象的内容按照右侧运算对象的要求移动指定位数,然后将经过移动的(可能还进行了提升)左侧运算对象的拷贝作为求值结果。

其中,右侧的运算对象一定不能为负,而且值必须严格小于结果的位数,否则就会产生未定义的行为。

二进制位或者向左移(<<)或者向右移(>>),移出边界之外的位就被舍弃掉了:

左移运算符(<<)在右侧插入值为0的二进制位。

右移运算符(>>)的行为则依赖于其左侧运算对象的类型:

  • 如果该运算对象是无符号类型,在左侧插入值为0的二进制位
  • 如果该运算对象是带符号类型,在左侧插入符号位的副本或值为0的二进制位

如何选样要视具体环境而定。

位求反运算符

位求反运算符()将运算对象逐位求反后生成一个新值,将1置为0、将0置为1;

char类型的运算对象首先提升成int类型,提升时运算对象原来的位保持不变,往高位添加0即可。

因此在本例中,首先将bits提升成int类型,增加24个高位0,随后将提升后的值逐位求反。

位或、位异或运算符

与(&)、或(1)、异或(^)运算符在两个运算对象上逐位执行相应的逻辑操作:

  1. 对于位与运算符(&)来说,如果两个运算对象的对应位置都是1,则运算结果中该位为1,否则为0。
  2. 对于位或运算符(|)来说,如果两个运算对象的对应位置至少有一个为1,则运算结果中该位为1,否则为0。
  3. 对于位异或运算符(^)来说,如果两个运算对象的对应位置有且只有一个为1则运算结果中该位为1,否则为0。

有一种常见的错误是把位运算符和逻辑运算符搞混了,比如位与(&)和逻辑与(&&)、位或(|)和逻辑或(||)、按位求反(~)和逻辑非(!)。

使用位运算符

我们举一个使用位运算符的例子:假设班级中有30个学生,老师每周都会对学生进行一次小测验,测验的结果只有通过和不通过两种。为了更好地追踪测验的结果,我们用一个二进制位代表某个学生在一次测验中是否通过,显然全班的测验结果可以用一个无符号整数来表示:

unsigned long quiz1 = 0; // 我们把这个值当成是位的集合来使用


定义quiz1的类型是unsigned long,这样,quiz1在任何机器上都将至少拥有32位: 给quiz1赋一个明确的初始值,使得它的每一位在开始时都有统一且固定的值。

教师必须有权设置并检查每一个二进制位。例如,我们需要对序号为27的学生对应的位进行设置,以表示他通过了测验。为了达到这一目的,首先创建一个值,该值只有第27位是1,其他位都是0,然后将这个值与quiz1进行位或运算,这样就能强行将quiz1的第27位设置为1,其他位都保持不变。
为了实现本例的目的,我们将quiz1的低阶位赋值为0、下一位赋值为1,以此类推最后统计quiz1各个位的情况。
 使用左移运算符和一个unsigned 1ong类型的整数字面值1就能得到一个表示学生27通过了测验的数值:

1UL<<27 // 生成一个值,该值只有第27位为1 

1UL的低阶位上有一个1,除此之外(至少)还有31个值为0的位。之所以使用unsigned long类型,是因为int类型只能确保占用16位,而我们至少需要27位。上面这条表达式通过在值为1的那个二进制位后面添加0,使得它向左移动了27位。
接下来将所得的值与quiz1进行位或运算。为了同时更新quiz1的值,使用一条复合赋值语句:

quiz1 |= 1UL << 27; // 表示学生 27通过了测验


|=运算符的工作原理和+=非常相似,它等价于

quizl = quiz1 | 1UL <<27; //等价于quizl I= 1UL<<27;


假定教师在重新核对测验结果时发现学生27实际上并没有通过测验,他必须要把第27位的值置为0。此时我们需要使用一个特殊的整数,它的第27位是0、其他所有位都是1。将这个值与quiz1进行位与运算就能实现目的了:

quizl &= (1UL <<27); //学生27没有通过测验


通过将之前的值按位求反得到一个新值,除了第27位外都是1,只有第27位的值是0。随后将该值与quiz1进行位与运算,所得结果除了第27位外都保持不变。

最后,我们试图检查学生27测验的情况到底怎么样:

bool status = quizl & (1UL <<27);//学生27是否通过了测验?


我们将quiz1和一个只有第27位是1的值按位求与,如果quiz1的第27位是1,计算的结果就是非0(真);否则结果是0。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ShardingSphere啦啦啦

N年前写的ShardingSphere部分&#xff08;上&#xff09;_sharding 分库不能sum-CSDN博客 https://shardingsphere.apache.org/document/current/en/quick-start/ 高性能架构模式&#xff1a; 读写分离&#xff1a;读写操作分散到不同的节点上 (这句话 我悟了) 据SQL语义分…

磁盘在哪里清理?电脑磁盘清理的5个方法

当我们使用电脑时&#xff0c;随着时间的推移&#xff0c;磁盘空间可能会逐渐减少&#xff0c;这通常是因为各种临时文件、系统更新、浏览器缓存等原因造成的。磁盘空间不足可能会导致电脑性能下降&#xff0c;因此定期清理磁盘是非常必要的。那么&#xff0c;磁盘在哪里清理呢…

2核4G服务器优惠价格和性能测试,2024年

阿里云2核4G服务器租用优惠价格&#xff0c;轻量2核4G服务器165元一年、u1服务器2核4G5M带宽199元一年、云服务器e实例30元3个月&#xff0c;活动链接 aliyunfuwuqi.com/go/aliyun 活动链接如下图&#xff1a; 阿里云2核4G服务器优惠价格 轻量应用服务器2核2G4M带宽、60GB高效…

软件质量属性总结

软件系统的质量就是“软件系统与明确地和隐含地定义的需求相一致的程度”。更具体地说&#xff0c;软件系统质量是软件与明确地叙述的功能和性能需求文档中明确描述的开发标准以及任何专业开发的软件产品都应该具有的隐含特征相一致的程度。 根据GB/T 16260.1定义&#xff0c;从…

Java学习day1

打开命令提示符&#xff08;cmd&#xff09;窗口&#xff1a; 按下winR键&#xff0c;输入cmd 按回车或点击确定&#xff0c;打开cmd窗口 常用cmd命令 盘符名称冒号&#xff08;D:)&#xff1a;盘符切换&#xff0c;示例表示由C盘切换到D盘 dir&#xff1a;查看当前路径下的内…

元宇宙VR数字化艺术展降低办展成本

元宇宙AI时代已经来临&#xff0c;越来越多人期待在元宇宙数字空间搭建一个属于自己的虚拟展厅&#xff0c;元宇宙虚拟展厅搭建平台是VR公司深圳华锐视点为企业研发的可编辑工具&#xff0c;那么元宇宙虚拟展厅搭建平台有哪些新突破? 元宇宙虚拟展厅搭建平台采用了先进的web3D…

扫描二维码如何展现不同内容?内容组合排版展示的二维码怎么做?

扫描二维码来查看内容的方式已经被广泛使用&#xff0c;比如视频、文件、图片、音频、文本等类型的内容都可以应用二维码来提供展示。那么有些时候需要展示的内容类型较多&#xff0c;需要将不同的内容组合到一起展示&#xff0c;该如何来操作呢&#xff1f; 下面的内容学会之…

【QT入门】 Qt自定义信号后跨线程发送信号

往期回顾&#xff1a; 【QT入门】 lambda表达式(函数)详解-CSDN博客 【QT入门】 Qt槽函数五种常用写法介绍-CSDN博客 【QT入门】 Qt实现自定义信号-CSDN博客 【QT入门】 Qt自定义信号后跨线程发送信号 由于Qt的子线程是无法直接修改ui&#xff0c;需要发送信号到ui线程进行修改…

Windows Insiders WSLg Linux GUI App 支持尝鲜

2021 年 4 月 21 日&#xff0c;微软在 Developer Blogs 发布了 Windows 预览版 WSL&#xff08;Windows Linux 子系统&#xff09; 对 Linux GUI App 的支持的公告&#x1f517;&#xff0c;碰巧&#x1f600;我最近重装了波电脑&#xff0c;系统换成了 Windows Insiders&…

HCIP的学习(3)

网络类型及数据链路层协议 网络类型分类 P2P网络----点到点网络类型MA网络-----多点接入网络 BMA----广播型多点接入网络NBMA—非广播型多点接入网络&#xff08;快淘汰了&#xff09; 数据链路层协议 MA网络 以太网协议 特点&#xff1a;需要使用MAC地址对设备进行区分…

安装IK分词器 + 扩展词典配置 + 停用词典配置

安装IK分词器 1.在线安装ik插件&#xff08;较慢&#xff09; # 进入容器内部 docker exec -it elasticsearch /bin/bash ​ # 在线下载并安装 ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elastics…

专业140+总分410+南京大学851信号与系统考研经验南大电子信息与通信集成,电通,真题,大纲,参考书。

今年分数出来还是有点小激动&#xff0c;专业851信号与系统140&#xff08;感谢Jenny老师辅导和全程悉心指导&#xff0c;答疑&#xff09;&#xff0c;总分410&#xff0c;梦想的南大离自己越来越近&#xff0c;马上即将复试&#xff0c;心中慌的一p&#xff0c;闲暇之余&…

[综述笔记]A Survey on Deep Learning for Neuroimaging-Based Brain Disorder Analysis

论文网址&#xff1a;Frontiers | A Survey on Deep Learning for Neuroimaging-Based Brain Disorder Analysis (frontiersin.org) 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论…

Java 8 内存管理原理解析及内存故障排查实践

作者&#xff1a;vivo 互联网服务器团队- Zeng Zhibin 介绍Java8虚拟机的内存区域划分、内存垃圾回收工作原理解析、虚拟机内存分配配置&#xff0c;介绍各垃圾收集器优缺点及场景应用、实践内存故障场景排查诊断&#xff0c;方便读者面临内存故障时有一个明确的思路和方向。 …

NBlog Java定时任务-备份MySQL数据

NBlog部署维护流程记录&#xff08;持续更新&#xff09;&#xff1a;https://blog.csdn.net/qq_43349112/article/details/136129806 为了避免服务器被攻击&#xff0c;给博客添加了一个MySQL数据备份功能。 此功能是配合博客写的&#xff0c;有些方法直接用的已有的&#xf…

地理坐标系与UTM坐标系转换并进行gazebo测试

地理坐标系与UTM坐标系转换并进行gazebo测试 经纬度到UTM坐标的转换gazebo测试环境 全球卫星导航系统(Global Navigation Satelite System,GNSS)&#xff0c;简称卫星导航&#xff0c;是室外机器人定位的一个主要信息来源。 卫星导航能给机器人提供什么信息&#xff1f; 正常工…

解决Matplotlib 画图中文无法正常显示的问题(显示方框)

解决Matplotlib 画图中文无法正常显示的问题&#xff08;显示方框&#xff09; 错误描述解决方案一&#xff08;暂时解决&#xff09;解决方法二&#xff08;永久解决&#xff09;测试代码 错误描述 这个错误消息来自于使用 Python 的 IPython 环境&#xff0c;特别是在尝试输出…

基于 Google MediaPipe 进行人体姿势估计演示

用于人体姿势估计的 MediaPipe 演示 MediaPipe简介 MediaPipe是一个开源框架&#xff0c;用于构建跨平台、多模式应用机器学习管道。它由 Google 开发&#xff0c;旨在促进基于机器学习的功能的快速开发和部署&#xff0c;特别关注音频、视频和时间序列数据。 我可以将 MediaPi…

高标准农业四情监测系统的应用范围

高标准农业四情监测系统的应用范围【TH-Q1】随着科技的不断进步&#xff0c;高标准农业四情监测系统已经逐渐成为现代农业的重要组成部分。这一系统能够实时监测土壤、气候、作物生长和病虫害情况&#xff0c;为农业生产提供精准的数据支持&#xff0c;从而提高农作物的产量和质…

小红书离线数仓提效新思路,提升百倍回刷性能

数据处理效率一直是大数据时代的核心话题&#xff0c;它推动着各类数据执行引擎持续迭代产品。从早期的 MapReduce&#xff0c;到今天的 Spark&#xff0c;各行业正不断演进其离线数仓技术架构。 现有以 Spark 为核心的数仓架构在处理大规模数据回刷方面已取得进展&#xff0c;…