位运算可以实现哪些功能
许多时候,我们为了减少算法的时间复杂度,都是推荐使用位运算,今天我们整理一下位运算可以实现哪些功能。
1. 乘除2
左移1位乘以2,左移n位乘以2^n;
右移1位除以2,右移n位除以2^n;
举个例子:
- #include<iostream>
- using namespace std;
- int main()
- {
- int a = 16;
- int b = 25;
- //乘除2
- cout<<(b<<1)<<' '<<(a>>1)<<endl;
- return 0;
- }
2. 判断奇偶数
用到位运算中的按位与,和1按位与。
如下:
- #include<iostream>
- using namespace std;
- int main()
- {
- int a = 16;
- int b = 25;
- // 判断奇偶数
- if(a & 1)
- cout<<"Odd"<<endl;
- else
- cout<<"Even"<<endl;
- return 0;
- }
3. 取余运算
还是使用按位与运算符,只不过不再是和1按位与了。
- #include<iostream>
- using namespace std;
- int main()
- {
- int a = 16;
- int b = 25;
- // 取余
- cout<<(a & 3)<<endl; // 除以4的余数
- cout<<(a & 7)<<endl; // 除以8的余数
- cout<<(a & 8)<<endl; // 无效,只能运算2的次幂的余数
- return 0;
- }
分析:注意这个方法只能计算2的次幂的余数,而且参加按位与的只能是2^n-1,因为这些数的二进制形式全是1.
4. 求相反数
使用按位取反运算符。
- //求相反数
- cout<<(~a+1)<<endl;
5. 求绝对值
使用异或运算符(^)
- #include<iostream>
- using namespace std;
- int main()
- {
- int a = -36;
- int b = 25;
- // 绝对值
- int tmp = a>>31; // /a大于等于0时tmp为0,a小于0时tmp为-1
- int A = (a^tmp)-tmp;
- cout<<A<<endl;
- return 0;
- }
这些基本的数学运算都是可以通过为运算符来实现,时间复杂度都比较低,以后常用。