打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
神奇的位运算及其简单应用 ?

学过C/C++一定学过位运算,但是大多数教科书上仅仅介绍了运算符的基本用法,没有提到位运算的应用,借此,本人特地收集了位运算的基本应用,希望大家能体会位运算的奥妙之处。

首先还是先介绍一遍一些基本的运算符:&(按位与)、|(按位或)、^(按位异或)、~ (按位取反)、>> (右移运算)、<<(左移运算)。具体意义书上都有,在此就不多阐述。

以下文章仅仅对位运算做抛砖引玉,其他进阶应用会在今后的文章中补充!
1. 变量交换
首先说个好玩的——诡异的变量交换。
交换两个int变量平时写程序会经常用到,当时,常规方法都要用三个变量,但是位运算里不需要第三个变量,仅仅需做三次异或运算:
a ^= b;
b ^= a;
a ^= b;
经过这样的三次异或运算后, a、b两个变量的值就交换过来了,原理?

原因是异或运算的逆运算就是自己,也就是一个数对一个数异或运算两次就是其本身。
2. 位运算实现int型快速乘法运算
判断奇偶性(对2取余):
a&1 == 0    偶数
a&1 == 1    奇数
计算2^n
1 << n
对2^n做乘法或除法:
a << n  等价于  a * (2 ^ n)
a >> n  等价于  a / (2 ^ n)
看到这里,也许大家会很纳闷,好好的乘法除法为什么要写成位运算呢?
其实,位运算的操作单元是bit,运算效率能提高60%。
在平时写程序的过程中,适当应用这些运算,可以大大提高程序的运行速度,下面以经典的二分求幂做一个例子:
int Power(int a, int n, int mod) // cal (a^n)%mod{int ans = 1;while (n > 0) {if (n & 1) {ans *= a;n--;} else {a *= a;n >>= 1;}ans %= mod;}return ans;}
3. 位运算的其他应用
(1) 取int型变量a的第k位 (k=0,1,2……sizeof(int))
a>>k&1
(2) 将int型变量a的第k位清0
a=a&~(1<<k)
(3) 将int型变量a的第k位置1
a=a|(1<<k)
(4) int型变量循环左移k次
a=a<<k|a>>16-k   (设sizeof(int)=16)
(5) int型变量a循环右移k次
a=a>>k|a<<16-k   (设sizeof(int)=16)
(6) 实现最低n位为1,其余位为0的位串信息:
~(~0 << n)
(7)截取变量x自p位开始的右边n位的信息:
(x >> (1+p-n)) & ~(~0 << n)
(8)截取old变量第row位,并将该位信息装配到变量new的第15-k位
new |= ((old >> row) & 1) << (15 – k)
(9)设s不等于全0,代码寻找最右边为1的位的序号j:
for(j = 0; ((1 << j) & s) == 0; j++) ;
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
C语言程序设计案例式教程-第3章 运算符与表达式
357,交换两个数字的值
二进制逻辑运算详解
位运算应用口诀和实例
JAVA中的异或的交换原理
乘法逆元 模的运算规则
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服