一 按位与运算符

“&”按位与运算符,全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. POD状态整理(持续更新)

    pendding Pod一直停留在Pending状态,可能表示,该Pod不能被调度到某一个节点上------我遇到的一个情况确实是这样的,因为我要mount的卷是在worker1上的,由于pod运行时 ...

  2. javascript获取浏览器窗口分辨率|浏览器全屏分辨率|屏幕分辨率

    浏览器窗口分辨率指显示网页的区域,在PC端由于浏览器窗口大小可调节,这个值是可变的.在手机等移动端浏览器窗口大小不可调节,宽度值是固定的,但竖屏和横屏切换会改变. 浏览器全屏分辨率是指浏览器启用全屏显 ...

  3. linux查找服务位置

  4. raid 0 与raid 1的区别?

    区别共有三点: 1.两者的概念不同: RAID 0:是多磁盘数据分组同步写读. RAID 1:是多磁盘同数据同步写读. 2.两者的安全性不同: RAID 0:无数据备份功能,安全性差. RAID 1: ...

  5. jupyter notebook代码无法运行

    如果是anaconda的话,直接就带有jupyter而不需要重新安装,你这样子就是路径混乱了.先输入jupyter kernelspec list查看安装的内核和位置,然后进入显示的安装目录,打开ke ...

  6. under display camera

    https://yzhouas.github.io/projects/UDC/udc.html https://zhuanlan.zhihu.com/p/389863230 MIPI 2022 Cha ...

  7. Centos+django+uwsgi+python 环境搭建

    首先需要具备linux的基本操作. centos 6.x 版本默认安装的 python 版本为2.x 输入: [root@dev ~]# python -VPython 2.6.6 下面装一些用到的库 ...

  8. egg开发系列--模板语法

    在这里列一下 nunjucks 常用的模板内容 首先需要在plugin.js 当中引入 exports.nunjucks = { enable: true, package: 'egg-view-nu ...

  9. c# 如何实现图片压缩

    一般在web应用中,对客户端提交上来的图片肯定需要进行压缩的.尤其是比较大的图片,如果不经过压缩会导致页面变的很大,打开速度比较慢,当然了如果是需要高质量的图片也得需要生产缩略图. 下面贴出我自己琢磨 ...

  10. leetcode 655. 输出二叉树 【时间击败100.00%】 【内存击败96.49%】

    1 public List<List<String>> printTree(TreeNode root) { 2 ArrayList<List<String> ...