博客
关于我
【算法】解析位运算
阅读量:396 次
发布时间:2019-03-05

本文共 1710 字,大约阅读时间需要 5 分钟。

位运算符是作用于整数的运算对象,把运算对象看成二进制的集合。

运算符 功能 用法
~ 按位求反 ~expr
<< 按位左移 expr1 << expr2
>> 按位右移 expr1 >> expr2
& 按位与 expr1 & expr2
^ 按位异或 expr1 ^ expr2
| 按位或 expr1 | expr2

按位求反(~)
将运算对象的二进制逐位求反,将1置为0,将0置为1,后得到一个新的值。

int j = 10;cout << (~j) << endl;//-11

按位左移(<<)
将运算对象的二进制位往左移动n位,右边以数字0补充空出来的二进制位,后得到一个新的值。一个数m往左移动n位后(移动的范围在容器的范围内),那么新的值将会是m*2n

int j = 10;cout << (j << 2) << endl;//40

按位右移(>>)
将运算对象的二进制位往右移动n位,左边以0或1补充,具体的实现规则要根据具体的环境而定。通常情况下,若是负数那么左边补充1,若是正数那么左边补充0。一个浮点数m往右移动n位后,那么新的值将会是floor(m / 2n),其中floor(x)返回一个小于或等于浮点数x的最大的整数。

int j = 10;cout << (j >> 2) << endl;//2j = -10;cout << (j >> 2) << endl;//-3

按位与(&)
将两个运算对象的二进制逐位执行与的逻辑操作,只有两个相同位置都是1,结果才是1;否则是0。

int j = 10;int i = 3;cout << (j & i) << endl; //2

按位或(|)
将两个运算对象的二进制逐位执行或的逻辑操作,两个相同位置只要有一个是1,结果就是1;否则为0。

int j = 10;int i = 3;cout << (j | i) << endl; //11

按位异或(^)
将两个运算对象的二进制逐位指向异或的逻辑操作,两个位相同,结果为0;否则为1。

int j = 10;int i = 3;cout << (j ^ i) << endl; //9

口诀:

按位与(&),两个都是1,才是1。按位或(|),只要有一个为1,就是1。按位异或(^),相同的为0,不同的为1。

位运算符的使用案例
假设班级中有30个学生,老师每周都会对学生进行一次小测试,测试结果只有通过和不通过两种。我们用二进制位代表某个学生在一次测试中是否通过,显然全班学生可以用一个无符号整数来表示:

unsigned long quiz1 = 0;

这里之所以使用long而不是用int,是因为long在每台机器上至少都有32位(有30个学生,可以满足要求),而int不能保证在每台机器上都有32位(int的最小大小是16位)。

教师必须有权检查每一个二进制位。例如:我们需要对序号为27的学生进行对应的位设置,以表示它通过测验。为了达到这一目的,首先创建一个值,该值只有第27位是1,其它位是0,然后再将这个值与quiz1进行或运算,这样就能将quiz1的第27位设置为1,其它位不变。
为了实现这个目的,需要使用左移运算符和一个unsigned long类型的整数字面值1就能得到学生第27号学生通过检测的数值:

1UL << 27;//UL 是unsigned long类型

接下来与quiz1进行或运算:

quiz1 |= 1UL << 27;//将第27位改为1(通过测试)

假设在重新核对测试结果后发现第27号学生并没有通过测试,他必须将第27位置为0。此时需要一个特殊的整数,它的第27位是0,其它位是1,然后将这个值与quiz1进行安位与运算,所得结果除了第27位变成0,其它位都没变。

quiz1 &= ^(1UL << 27);//将第27位改为0(未通过测试)

最后,我们试图检测第27位学生的测试情况到底怎么样:

bool status = quiz1 & (1UL << 27);

如果quiz1的第27位是1,那么计算结果就是非0(真),否则结果是0。

转载地址:http://yshzz.baihongyu.com/

你可能感兴趣的文章
Python 之网络式编程
查看>>
MySql5.5安装步骤及MySql_Front视图配置
查看>>
mybatis绑定错误-- Invalid bound statement (not found)
查看>>
Java内存模型(JMM)
查看>>
快速指数算法
查看>>
python去除字符串中的特殊字符(爬虫存储数据时会遇到不能作为文件名的字符串)
查看>>
SpringCloud微服务(03):Hystrix组件,实现服务熔断
查看>>
Spring 框架基础(01):核心组件总结,基础环境搭建
查看>>
Cassandra数据建模
查看>>
Internet Explorer 10 专题上线
查看>>
云计算之路-阿里云上:0:25~0:40网络存储故障造成网站不能正常访问
查看>>
网站故障公告1:使用阿里云RDS之后一个让人欲哭无泪的下午
查看>>
上周热点回顾(6.3-6.9)
查看>>
上周热点回顾(8.12-8.18)
查看>>
蹒跚来迟:新版博客后台上线公测
查看>>
[网站公告]又拍云API故障造成图片无法上传(已恢复)
查看>>
云计算之路-阿里云上:“黑色30秒”走了,“黑色1秒”来了,真相也许大白了
查看>>
上周热点回顾(6.9-6.15)
查看>>
.NET跨平台之旅:借助ASP.NET 5 Beta5的新特性显示CLR与操作系统信息
查看>>
上周热点回顾(7.27-8.2)
查看>>