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

[知识点]C++中的运算符

1、前言

  之前最开始学习语法和基础知识的时候,基本上最简单的运算符有所接触,当时对于位运算这种东西完全没有概念。今天对C++中出现的部分运算符尤其是位运算符进行一些总结。

 

2、+ - * / %

  这些貌似不用讲吧?小学生都知道了。

 

3、&& ||

  两大基础逻辑运算符,&&表示“和”,前后连接两个值,形如a && b,当且仅当a==1并且b==1,返回值为1,否则为0;||表示“或”,前后连接两个值,形如a || b,当a==1或者b==1时,返回值为1;否则为0。

 

4、<< >>

  位运算符。形如a << b,表示a在二进制形式下向左移动b位。如:10 << 2 -> [1010](2) << 2 -> [101000](2) -> 40。然而只要你清楚二进制数的意义,并且通过这个样例,很快就可以发现左移一位就相当于乘2,而一般运用得较多的地方也是这里,由于电脑位运算速度较快,所以a=a*2就可以转换为a=a<<1,一来加快速度,二来可以装逼哦。

  同理,<<就是相反的含义了,不多解释。

 

5、& | ^

  咋一看和第3项似乎有点像,但是这些都是位运算符,可和第3项也存在一些相通的地方。这些位运算符的共同点是将他们转换为二进制数,然后按位计算,最后返回值。一个个来解释:

 

① & 和

对于每一位,存在:

  1&1=1;1&0=0;0&1=0;0&0=0。

  即当且仅当两个数的这一位均为1,返回值为1,否则为0。举一个实例:10&3=[1010](2)&[0011](2)=[0010](2)=2

  作为整体时,布尔值返回值在当且仅当每一位返回值均为0时返回0,否则为1。

  应用:判断奇偶性的时候,通常会写: if (n%2==0),可写成:if (n&1==0)。

 

② | 或

对于每一位,存在:

  1|1=1;1|0=1;0|1=1;0|0=0。

  即两个数的这一位只要有一位为1,返回值为1;否则为0。举一个实例:10|3=[1010](2)|[0011](2)=[1011](2)=11

  作为整体时,布尔值返回值在当且仅当每一位返回值均为0时返回0,否则为1。

 

③^ 异或

对于每一位,存在:

  1^1=0;1^0=0;0^1=0;0^0=1。

  即两个数的这一位相同时返回1,不同时返回0。举一个实例:10^3=[1010](2)^[0011](2)=[0110](2)=6

  作为整体时,布尔值返回值在当且仅当每一位返回值均为0时返回0,否则为1。

  应用:这是一个非常强大的位运算符,起码我是这么觉得,因为当我了解到之后都感觉似乎不可能,但是事实证明这是正确的。

 

<1>更方便地交换两个数的值

-----------------------------------------------------------------------------------------------------

void swap(int &a,int &b) { a^=b; b^=a; a^=b; }

-----------------------------------------------------------------------------------------------------

 

<2>例题:在一个数列中存在2*n+1个数,其中有n个数出现了两次,一个数出现了一次,请找出那个数。首先容易想到一个算法,作标记,时间复杂度为O(2n)。但是,巧妙地运用^,可以达到O(n),如下代码:

-----------------------------------------------------------------------------------------------------

void find()

{

  int ans=0;

  for (int i=1;i<=n;i++) ans^=a[i];

  printf("%d",ans);

}

-----------------------------------------------------------------------------------------------------

转载于:https://www.cnblogs.com/jinkun113/p/4709086.html

相关文章:

  • 六间房 繁星 酷我 来疯 秀吧 新浪秀 直播播放器 Live 1.2
  • 组合条件测试
  • VCE文件的另类打开方式
  • 织梦DEDECMS {dede:field name='position'/}标签增加其它属性的
  • 各种链接
  • hdu 1316 How Many Fibs?
  • jboss7 添加虚拟目录 上传文件路径
  • OSChina 周六乱弹 —— 流氓软件是这样耍流氓的
  • 修改mysql用户密码
  • JavaWeb项目中WEB-INF目录下class文件自动生成以及显示
  • AVAudioPlayer播放音频文件时没声音
  • yum方式安装mysql报错找不到mysql.sock
  • LCM性质 + 组合数 - HDU 5407 CRB and Candies
  • poj 2513 Colored Sticks(欧拉路径+并检查集合+特里)
  • 在eclipse中建立lua开发环境
  • 【面试系列】之二:关于js原型
  • CAP 一致性协议及应用解析
  • GitUp, 你不可错过的秀外慧中的git工具
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • 基于HAProxy的高性能缓存服务器nuster
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 那些年我们用过的显示性能指标
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #1014 : Trie树
  • #QT(TCP网络编程-服务端)
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (10)STL算法之搜索(二) 二分查找
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (九)One-Wire总线-DS18B20
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (学习日记)2024.01.09
  • (译) 函数式 JS #1:简介
  • (转) ns2/nam与nam实现相关的文件
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)EOS中账户、钱包和密钥的关系
  • (转载)hibernate缓存
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .chm格式文件如何阅读
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .Net6 Api Swagger配置
  • .NET关于 跳过SSL中遇到的问题
  • .net经典笔试题
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复