一 按位与运算符

“&”按位与运算符,全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. 【msys2】更新镜像源

    更新镜像源 镜像源的地址如:D:\msys64\etc\pacman.d 从下面选择镜像源剪切到Primary中第一行: 如下图,目录底下的所有都需要更改: 之后需要强制更新一下列表,https:// ...

  2. 3、app自动化:使用appium定位元素的方式及元素的常用操作

    前提: 没有的包,要先进行对应包的安装 如:pip install Appium-Python-Client 一.定位元素,包括属性定位和xpath定位方式 a\属性定位 属性 定位方式     示例 ...

  3. git 问题解决

    1. fatal: the remote end hung up unexpectedly git config --global http.postBuffer 104857600 其他方案: gi ...

  4. esp8266 -rtos-sdk-vscode-config

    kiteconfig 工作区配置文件:hello_world.code-workspace {      "folders": [         {             &q ...

  5. Linux CentOS下搭建golang 1.17 开发环境

    1. 下载软件包并安装 cd ~ wget https://storage.googleapis.com/golang/go1.17.2.linux-amd64.tar.gz tar zxvf go1 ...

  6. oracle学习之redo

    Oracle的重做日志基本概念及原理 重做日志文件 redo log file 通常也称为日志文件,它是保证数据库安全和数据库备份与恢复的文件,是数据库安全和恢复的最基本的保障.管理员可以根据日志文集 ...

  7. for in | for in 比较 解释 | 以后找知识点先从这里面搜索

    const obj = { a: 1, b: 2, c: 3 } for (let i in obj) { console.log(i) // a // b // c } for (let i of ...

  8. (K8s学习笔记六)Pod的调度

    RC(ReplicationController)只能选择一个标签,RS(ReplicaSet)可选择多个标签,例如APPTest发布了v1和v2两个版本,并希望副本数为3,可同时包含v1和v2两个版 ...

  9. 【STM32】SYSCLK配置|学习笔记

    一.RCC原理 所有stm32的外设都是挂载在相应的时钟上的,如下 挂载在AHB上的外设 挂载在APB1上的 APB2上的 所以RCC很重要,特别像TIM这种对时钟特别敏感的外设就必须把SYSCLK确 ...

  10. hierarchical-clustering

    https://ww2.mathworks.cn/help/stats/hierarchical-clustering.html https://ww2.mathworks.cn/help/stats ...