C++中的位运算总结
1)位运算
位运算是指对转换成二进制的数字进行每一位上的0、1的运算,运算涉及到五种运算:与(&),或(|),异或(^),左移(<<),右移(>>)。
如下表所示:
与(&) | 0 & 0 =0 | 1 & 0 = 0 | 0 & 1 = 1 | 1 & 1 = 1 |
或(|) | 0 | 0 = 0 | 1 | 0 = 1 | 0 | 1 = 1 | 1 | 1 = 1 |
异或(^) | 0 ^ 0 = 0 | 1 ^ 0 = 1 | 0 ^ 1 = 1 | 1 ^ 1 =0 |
左移(<<) |
0001 1001 << 2 = 0110 0100 1000 1010 << 3 = 0101 0000 |
|||
右移(>>) |
0000 1010 >> 2 = 0000 0010 1000 1010 >> 3 = 1111 0001 |
左移:
左移运算符m << n表示把m左移n位。在左移n位的时候,最左边的n位将被丢弃,同时在最右边补上n个0。
右移:
右移运算符m >> n表示把m右移n位。右移n位的时候,最右边的n位将被丢弃。但是与左移不一样的是,右移时候的最左边的n位处理:如果数字是一个无符号数值,则用0填补最左边的n位;如果数字是一个有符号数值,则用数字的符号位填补最左边的n位,如上表中的:1000 1010 >> 3 = 1111 0001。
这五种运算符都是双目操作符,另有一种单目操作符~,表示取反。即:~1 = 0,~0 = 1。
位运算符只能用于整型数据,对于其它类型的数据进行位操作编译器会报错。
位运算符的优先级比较低,因此应尽量使用括号来保证运算顺序。
2.位运算符的常用技巧
1)判断奇偶
只要根据最末位是0还是1即可判断整数的奇偶性。例如整数n,可以用if((n & 1) == 0)来判断,要比if(n % 2 == 0)判断奇偶性效率高。
2)交换数据
void swap(int &a, int &b)
{
if (a != b)
{
a ^= b;//a=(a^b); b ^= a;//^运算满足交换律,b^(a^b)=b^b^a a ^= b;//a=(a^b)^a
}
}
由于一个数和自己异或的结果为0,并且任何数与0异或都会不变的,所以第二步中b ^= a就等价于b = b ^ b ^ a = a,即b被赋上了a的值。
3)变换符号
正整数变成负整数,负整数变成正整数,只需将原数的二进制取反后加1即可。例如:
对于-11和11,可以通过下面的变换方法将-11变成11
1111 0101(二进制) 取反-> 0000 1010(二进制) 加1-> 0000 1011(二进制)
同样可以这样的将11变成-11
0000 1011(二进制) 取反-> 0000 0100(二进制) 加1-> 1111 0101(二进制)
3.位运算应用
1)高低位互换
它即是十进制的55430。
这个问题用位操作解决起来非常方便,设x=34520=10000110 11011000(二进制) 由于x为无符号数,右移时会执行逻辑右移即高位补0,因此x右移8位将得到00000000 10000110。而x左移8位将得到11011000 00000000。可以发现只要将x>>8与x<<8这两个数相或就可以得到1101100010000110。
如果一个整数是2的整数次方,那么它的二进制标识中一定有且只有一位是1,而其他所有位均为0.
解决方案:
把这个整数减去1之后再和本身做与运算,这个整数中唯一的一个1就会变成0.所以只要判断是不是等于0即可。
最新文章
- sql将查询的结果集一次性插入到表变量中
- 【JS/CSS3】实现带预览图幻灯片效果~
- pixi.js教程中文版--基础篇
- Android上dip、dp、px、sp等单位说明
- 1-03 Sql Sever 的身份验证模式
- 【练习】使用服务下载图片并保存到sdcard
- JavaScript入门(4)
- 深入浅出SlidingMenu
- 同步linux服务器的时间
- 【转】Entity Framework 5.0系列之自动生成Code First代码
- BootStrap 专题
- HTML常用标签2
- 百度-淘宝-360搜索引擎搜索API
- java 封装及this 用法
- 思维导图软件 xMind 基本用法
- 原生js封装的获取某一天是当年的第几周方法
- CDH5上安装Hive,HBase,Impala,Spark等服务
- [转载]TortoiseGit安装与使用
- sharepoint 2013 office web app 2013 文档在线浏览 IE11 浏览器不兼容解决方法
- jQuery源码学习笔记二
热门文章
- USACO CHAPTER 1 1.1 Ride 水题
- 2.Could not open Selected VM debug port (8700). Make sure you do not have another instance of DDMS or of the eclipse plugin running
- linux 常用alias
- compass项目监控文件报 /usr/bin/env 找不到文件
- [FlashPlyaer] FP版本20.0.267对Win10的64位系统的不兼容问题
- eclipse对项目整理分类
- Java SE 第十六讲----面向对象特征之继承
- 在delphi的exe文件中嵌入另外一个exe文件
- jquery ui datepicker中文显示
- tarjan 边双连通分量 对点进行分组 每组点都在一个双连通分量里边