c++学习 4 运算符及其应用技巧
一 按位与运算符
“&”按位与运算符,全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 运算符及其应用技巧的更多相关文章
- JAVA学习之Ecplise IDE 使用技巧(2)第二章:键盘小快手,代码辅助
上一篇:JAVA学习之Ecplise IDE 使用技巧(1)第一章:我的地盘我做主,工作空间 第二章:键盘小快手,代码辅助 内容包括: 第一:显示行号 如何设置行号:Ecplice菜单Windows& ...
- C++学习之运算符重载的总结
C++学习之运算符重载的总结 运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用域不同类型的数据导致不同行为的发生,C++为运算符重载提供了一种方法,即运算符重载函数 ...
- 工作流程,编程,调试,性能:Unity游戏开发者应该学习的20个改进技巧
Unity 是一个备受欢迎的游戏开发平台.它的功能令人印象深刻,同时也迎合了不同的游戏开发需求.游戏开发者可以使用 Unity 创建任何类型的游戏,从世界级的 RPG 游戏到最流行的增强现实游戏 Po ...
- Dart学习笔记-运算符-条件表达式-类型转换
Dart学习笔记-运算符-条件表达式-类型转换 一.运算符 1.算术运算符 + (加)- (减)* (乘)/ (除)~/ (取整) %(取余) 2.关系运算符 == (等等) != (不等) > ...
- python学习第六天运算符总结大全
python学习第六天运算符总结大全,玖乐网络(www.96net.com.cn)列出下面详细 1,算术运算符 + 加 - 减 *乘 / 除 % 求模 ** 乘方 // 取整除 - 返回商的整数部分 ...
- MongDB4.0-入门学习之运算符
MongDB 4.0 入门学习之运算符 基本语法:db.collection.find({<key>:{$symbol:<value>}}) 条件查询匹配运算符 符号 描述 范 ...
- JAVA学习之Ecplise IDE 使用技巧(1)第一章:我的地盘我做主,工作空间
麦子学院/Andriod应用开发/第一阶段 Android 学前准备 第三课:Eclipse IDE 使用技巧 由马一鸣老师讲解.感谢麦子学院免费开放这部分视频资源. Eclipse由IBM开发的,2 ...
- 新手学习 Vim 的五个技巧
多年来,我一直想学 Vim.如今 Vim 是我最喜欢的 Linux 文本编辑器,也是开发者和系统管理者最喜爱的开源工具.我说的学习,指的是真正意义上的学习.想要精通确实很难,所以我只想要达到熟练的水平 ...
- java学习之运算符
学习完了变量+常量,现在只能简单的声明变量+赋值+打印变量. 但是程序要做的就是去处理数据,把原本散乱的数据,处理成有意义的数据,供我们来使用,这就涉及到了运算符的应用. 算数运算符常用的种类: 加法 ...
- Linux命令学习之两个小技巧(1)
本篇主要想讲两个小技巧.本来技巧之类的话应该放在学完整个东西之后或者在学习中遇到时再说的,但是这两个技巧其实很简单,很多人只要我一提就知道了.与其说是技巧,不如说是注意事项. 自动补全 在Linux终 ...
随机推荐
- 掌控安全学院SQL注入靶场-布尔盲注(二)
首页打开如下 判断注入 闭合报错 先判断数据库的长度....
- 在idea中查看jar包源码
文章目录 准备jar包 idea打开文件夹 最后一步 准备jar包 例如,我准备看resin的jar,在桌面准备了一份 idea打开文件夹 在idea中file====>open=====> ...
- TS补充笔记
TS掘金笔记:https://juejin.cn/post/6872111128135073806 *为疑惑点 类型总结: 2.6.1Enum类型数字枚举设置初始值: 2.6.1.1给第一个枚举 ...
- gitee下载项目
PS:如果直接在gitee仓库中选择下载zip,在本地打开项目后是不会与gitee远程库绑定的.如果要与远程库同步,需要选择克隆,同样的,本地需要先搭建好git环境. 1.在本地新建文件夹 2.在文件 ...
- 关于右值 std::move
今天发现一个情况,对容器map 进行 std::move 之后,原map被清空了. map<int, int> tmp; tmp[1] = 1; tmp[2] = ...
- 【踩坑】lua加载模块但找不到模块最蠢的原因
这个问题比较蠢,我用MinGW编译的lua去加载了MSVC编译的lua模块导致找不到符号,然后花了几个小时找为什么我VS项目使用函数导出接口了但是函数依然没有导出(使用dumpbin和nm都能看到导出 ...
- fillder弱网测试
打开Fiddler,Rules->Performance->勾选 Simulate Modem Speeds,勾选之后访问网站会发现网络慢了很多. 二.设置弱网参数:菜单Rules-> ...
- PCB Layout之EMMC_Flash走线总结@@@
PCB Layout之EMMC_Flash走线总结 1,数据线DATA[0-7]走线要(基本)等长(含芯片内部线长),线要短,线间距控制3W原则,参考面要完整(参考面下面最好不要走其它高速信号线),阻 ...
- GrADS CTL文件 VARS字段
GrADS可以读取GRIB格式的再分析数据,如ERA5,CFSR,CRA40等.对于这些数据,借助grib2ctl/g2ctl程序,生成描述文件(*.ctl文件),再通过gribmap命令,生成索引文 ...
- Zookeeper ZAB协议-Leader&Followe 对象创建和启动源码解析
这篇博客主要是解析了Leader,Follower 对象的创建,相对来说比较简单,主要是了解一下在实例化的时候创建了哪些对象,这些对象会在数据传输的过程中发挥比较打的作用,如果有了解过的,可以直接跳过 ...