`

位运算1

    博客分类:
  • C++
 
阅读更多

 

学过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++) ;

 

 

分享到:
评论

相关推荐

    java位运算1.pdf

    java位运算1.pdf

    c++位运算c++位运算

    c++位运算c++位运算c++位运算c++位运算c++位运算c++位运算c++位运算c++位运算c++位运算

    c语言位运算c语言位运算

    c语言位运算c语言位运算c语言位运算c语言位运算c语言位运算

    04_位运算1

    ① 与运算可以使某些位变 0 ② 或运算可以使某些位变 1 ③ 异或运算可以使某些位反转

    C#位运算及运算符

    0、逻辑运算符 1、位逻辑非运算 2、位逻辑与运算 4、位逻辑异或运算 5、位左移运算 6、位右移运算

    位运算c++位运算

    c++位运算

    位运算详解(通过excel表格详细对位运算进行讲解)

    正在学习位运算的人群

    3.6位运算1

    第三章 运算符与表达式主讲:刘晓光张海威 张莹殷爱茹 李雨森宋春瑶 沈玮卢少平计算机学院&网络空间安全学院高级语言C++程序设计计算机学院&网络空间安全学院算术

    位运算符,位运算,位段

    位运算是指按二进制位进行的运算。因为在系统软件中,常要处理二进制位的问题。文章介绍位运算符和位运算,位运算举例,位段等

    NullPointerC#Prepared-For-Better-Offer#位运算1

    位运算一个数的二进制表示求$n$的第$k$位数字一个数的二进制中1的个数返回$n$的最后一位1$x \text{&} -x$意味着取出最后一个1及其后面的数//

    ACM位运算技巧

    ACM位运算技巧 一些常用到的基本位运算技巧

    [宫水三叶的刷题日记]:位运算1

    2. 从侧边栏的类别目录找到「位运算」 3. 按照「推荐指数」从大到小进行刷题,「推荐指数」相同,则按照「难度」从易到 4. 拿到题号之后,回到本合集进行检索

    经典的位运算合集 Matrix67及总结

    统计一个整数的二进制中1的个数(位运算技巧) 收藏 统计一个整数的二进制中1的个数的三种方法 位运算讲稿_by_Matrix67 位运算之美——用+,-和位运算实现正整数除法和取模(二) 位运算之美——用+,-和位运算实现正...

    C语言位运算+实例讲解

    C语言位运算 有6种: &, | , ^(亦或), &lt;&lt;(左移), &gt;&gt;(右移)。 注意:参与位运算的元素必须是int型或者char型,以补码形式出现。 按位与& &运算常应用于: 迅速清零 保留指定位 判断奇偶性 a & 1 = 1...

    Java中的位运算

    Java的位运算

    8位ALU运算器(VHDL语言)

    (3)加减必须用最基本的1位全加器fa作为基础,可以采用直接由8次1位运算得到8位的操作;也可以先构造4位加法器,再进一步实现8位加减运算。 注意:算术运算的两个操作数要求都是带符号数,即1位符号位和7位数据位...

    位运算大全

    位运算大全 位运算详解 位运算实例 适合嵌入式开发

    java位运算操作

    Java位运算操作 左位移 右位移 与或非的操作

Global site tag (gtag.js) - Google Analytics