一 按位与运算符

“&”按位与运算符,全1为1,有0则0。

特点:和1相与保持不变,和0相与都变为0。

功能:将指定位置清0。

example:

1000 1100

& 1100 1011

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

1000 1000

unsigned int data;//目标:将1字节的data第3、4位清零。

data = data & 1110 0111;//注意,c++语言并不支持直接识别二进制数位做按位运算,必须得转换成十六进制。

data = data & 0xe7;//这才是正确的写法,但是难写并且可读性很低(十六进制的转换)。

//所以我们必须在十六进制的基础上优化写法,后续知识点补全后一起说

data &= 0xe7;//这个也行,而且写出来方便简洁。

二 按位或运算符

“|”按位或运算符,有1为1,全0才0。

特点:和1相或都得1,和0相或保持不变。

功能:将指定位置至为1。

example:
    1000 1100

|   1100 1111

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

1100 1111

unsigned int data;//data为1字节,将data的5、6位置为1,其他位不变。

data = data | 0110 0000;//在c++中,位数计数顺序是从右到左的。

data = data | 0x60;//而且也是需要十六进制才能被c++识别。

data |= 0x60;//简朴写法。

三 按位取反运算符

“~”按位取反运算符,0变1,1变0.

特点:取反码。

功能:配合按位与(&)和按位或(|)进行操作。

example:~1001 1100 == 0110 0011;

四 按位异或运算符

“^”按位异或运算符,相同位数为0,不同位数为1。

特点:和1异或取反,和0异或保持不变。

功能:将指定位发生翻转。

example:

1100 0011

^   1011 1111

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

0111 1100

1011 1100 ^ 1111 0000 == 0111 1100

五 左移运算符

“<<”左移运算符,左边丢弃,右边补0。

注意:移动的位数不要超过自身位的宽度。

example:

int data = 1011 0000;

data = data<<3;

cout<<data<<;//data等于1000 0000。

如果data=0000 0001=1,那么data<<1 = 0000 0010 =2=1*2^1;

以此类推,data << 2 = 0000 0100 = 4 =2^2;

data << 3 = 0000 1000 = 8 =2^3;

所以<<几位就是乘上2的几次方。

六 右移运算符

“>>”右移运算符,右边丢弃,左边补0或者补1。

注意:补0(逻辑右移)还是补1(算数右移)由编译器自己决定,用户无法自己决定。

无符号数:右边丢弃,左边补0。

正数:右边丢弃,左边补0。

负数:右边丢弃,左边补0(逻辑右移);

负数:右边丢弃,左边补1(算数右移)。

由五可知,data>>几位其实也就相当于除以2^x。

七 位运算符的综合应用

在书写按位运算符时,由于十六进制的限制导致我们无法快速解读出究竟是清0还是置1,以及操作位数是哪几位等等。所以我们需要借助特殊的写法来在十六进制的基础上提高位运算符的可读性。

example:

在按位与运算符中,我们做了“将data3、4位清0”的操作。

data &= 0xe7;//即为data &= 1110 0111;

我们来对1110 0111变形

1110 0111 == ~(0001 1000) == ~(0001 0000 | 0000 1000)//这一步重点理解!!!

== ~(0000 0001<<4 | 0000 0001<<3) == ~(0x01<<4 | 0x01<<3)

所以最后结果就可以写为

data &= ~(0x01<<4 | 0x01<<3);

不仅提高可读性,也降低了转换为十六进制的难度,可谓是一石二鸟。

同理可得,按位或运算符的例子里,data |= 0x60也可以因此转换。

data |= 0110 0000 == (0100 0000 | 0010 0000) == (0000 0001<<6 | 0000 0001<<5)

== (0x01<<6 | 0x01<<5)

所以也可以转换为 data |= (0x01<<6 | 0x01<<5);

总结:

1.有取反(~)是清0,无取反是置1;

2.使用这种写法,不仅可以根据操作位数直接写出十六进制,而且大大提高可读性,降低了操作难度。

c++学习 4 运算符及其应用技巧的更多相关文章

  1. JAVA学习之Ecplise IDE 使用技巧(2)第二章:键盘小快手,代码辅助

    上一篇:JAVA学习之Ecplise IDE 使用技巧(1)第一章:我的地盘我做主,工作空间 第二章:键盘小快手,代码辅助 内容包括: 第一:显示行号 如何设置行号:Ecplice菜单Windows& ...

  2. C++学习之运算符重载的总结

    C++学习之运算符重载的总结              运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用域不同类型的数据导致不同行为的发生,C++为运算符重载提供了一种方法,即运算符重载函数 ...

  3. 工作流程,编程,调试,性能:Unity游戏开发者应该学习的20个改进技巧

    Unity 是一个备受欢迎的游戏开发平台.它的功能令人印象深刻,同时也迎合了不同的游戏开发需求.游戏开发者可以使用 Unity 创建任何类型的游戏,从世界级的 RPG 游戏到最流行的增强现实游戏 Po ...

  4. Dart学习笔记-运算符-条件表达式-类型转换

    Dart学习笔记-运算符-条件表达式-类型转换 一.运算符 1.算术运算符 + (加)- (减)* (乘)/ (除)~/ (取整) %(取余) 2.关系运算符 == (等等) != (不等) > ...

  5. python学习第六天运算符总结大全

    python学习第六天运算符总结大全,玖乐网络(www.96net.com.cn)列出下面详细 1,算术运算符 + 加 - 减 *乘 / 除 % 求模 ** 乘方 // 取整除 - 返回商的整数部分 ...

  6. MongDB4.0-入门学习之运算符

    MongDB 4.0 入门学习之运算符 基本语法:db.collection.find({<key>:{$symbol:<value>}}) 条件查询匹配运算符 符号 描述 范 ...

  7. JAVA学习之Ecplise IDE 使用技巧(1)第一章:我的地盘我做主,工作空间

    麦子学院/Andriod应用开发/第一阶段 Android 学前准备 第三课:Eclipse IDE 使用技巧 由马一鸣老师讲解.感谢麦子学院免费开放这部分视频资源. Eclipse由IBM开发的,2 ...

  8. 新手学习 Vim 的五个技巧

    多年来,我一直想学 Vim.如今 Vim 是我最喜欢的 Linux 文本编辑器,也是开发者和系统管理者最喜爱的开源工具.我说的学习,指的是真正意义上的学习.想要精通确实很难,所以我只想要达到熟练的水平 ...

  9. java学习之运算符

    学习完了变量+常量,现在只能简单的声明变量+赋值+打印变量. 但是程序要做的就是去处理数据,把原本散乱的数据,处理成有意义的数据,供我们来使用,这就涉及到了运算符的应用. 算数运算符常用的种类: 加法 ...

  10. Linux命令学习之两个小技巧(1)

    本篇主要想讲两个小技巧.本来技巧之类的话应该放在学完整个东西之后或者在学习中遇到时再说的,但是这两个技巧其实很简单,很多人只要我一提就知道了.与其说是技巧,不如说是注意事项. 自动补全 在Linux终 ...

随机推荐

  1. [转]C#的反射

    一.反射简介 1.1.反射的说明 反射:指程序可以访问.检测和修改它本身状态或行为的一种能力(即:审查元数据并收集关于它的类型信息的能力). ①元数据(编译以后的最基本数据单元:指程序和程序类型本身的 ...

  2. Linux 系统镜像分类和包管理工具

    查看系统版本 cat /proc/version 可以看到如下返回,Linux是RedHat系统 Linux version 4.18.0-372.9.1.el8.x86_64 (mockbuild@ ...

  3. BIP查询框添加查询条件

    // 搜索框添加查询条件 viewModel.on("afterMount", function (data) { let agentId = viewModel.getParam ...

  4. C盘满了

      今天电脑提示说C盘磁盘满了,于是开始做磁盘清理 右击C盘,点管理. 点击磁盘清理,勾选中临时文件.下载.回收站.缩略图,然后点击清理系统文件. 再去查看C盘仍然没有多大变化,于是挨个翻看C盘到底哪 ...

  5. Zookeeper ZAB协议-客户端源码解析

    因为在Zookeeper的底层源码中大量使用了NIO,线程和阻塞队列,在了解之前对前面这些有个基础会更容易理解 ZAB 是Zookeeper 的一种原子广播协议,用于支持Zookeeper 的分布式协 ...

  6. gdb 常用命令总结

    安装插件 1. 安装GDB增强工具 (gef) * wget -q -O- https://github.com/hugsy/gef/raw/master/scripts/gef.sh | sh2. ...

  7. k8s_使用k8s部署博客系统svc、secret、configmap(三)

    service service是抽象Pod对外提供服务的地址,将其固化的作用:屏蔽因pod的创删以及扩缩容带来ip变化.service通过自身定义文件的selector的标签配置匹配到需要提供服务的对 ...

  8. download links

    1 anaconda https://mirrors.bfsu.edu.cn/anaconda/archive/

  9. java,抽象类,接口的方法,子类继承是不是必须全部实现

    普通类继承,并非一定要重写父类方法. 抽象类继承,如果子类也是一个抽象类,并不要求一定重写父类方法.如果子类不是抽象类,则要求子类一定要实现父类中的抽象方法. 接口类继承.如果是一个子接口,可以扩展父 ...

  10. javax.naming.NameNotFoundException: Name [aa.bb.cc/xx] is not bound in this Context. Unable to find [aa.bb.cc]

    今天尝试把一个SpringBoot项目由jdk11转移为jdk8,在IDEA里运行一切正常.打包,部署到tomcat启动后,在客户端调用WebSocket出现如下异常: java.lang.Illeg ...