位运算的应用
1. 判断偶数,判断最低位是0还是1即可,⽐求模快
x % 2 != 0 //x正负都可以判断;不⽤x%2 == 1,因为如果x为负奇数,x%2=-1
(x & 0x1) == 0
例如:
int x;
int main()
{
cin>>x;
if((x & 0x1)==0) cout<<"yes";
else cout<<"no";
return 0;
}
2.两个数的交换
a = a^b;//a变为⼀个相同为0,相异为1的结果
b = a^b;//该结果和b做运算,得到原来的a
a = a^b;//该结果和a做运算,得到原来的b
再来个实例说明下以加深印象。int a = 13, b = 6;
a的⼆进制为1101(⼆进制)
b的⼆进制为 110(⼆进制)
第⼀步 a^=b a = 1101 ^ 110 = 1011;
第⼆步 b^=a b = 110 ^ 1011 = 1101;即b=13
第三步 a^=b a = 1011 ^ 1101 = 110;即a=6
3.lowbit运算
lowbit 运算 是位运算中比较重要的运算方式,用于计算一个二进制数最低位的1。
lowbit 即二进制数最低位1所对应的值。
如,二进制数 0b01011000最低的 1是在第3位,对应值为0b1000,即8。
lowbit运算的实现
一个数的lowbit值,即一个数的最低位,可通过如下操作取出,复杂度为 O(1):
假设原来的数是a,对a取反加1得到~a+1,原数a和~a+1进行位与操作,就得到了lowbit值,即lowbit(a) = a & (~a + 1)。
当这个数是0,没有最低位1的时候,结果为0。
因为取反加1就是一个数的相反数的补码,因为lowbit也写作 lowbit(a)=a&(-a)
一个数消去它的lowbit位,由上面的lowbit求法,直接减去它的lowbit值即可。
即 a-(a&-a)也可以由a&(a-1)得到
4.求整数的⼆进制表⽰中1的个数,不⽤⼀个⼀个的移位判断
#include <bits/stdc++.h>
using namespace std;
int x,cnt;
int main()
{
cin>>x;
while(x!=0)
{
cnt++;
x&=x-1;//将最右边的1置为0;正负都可计算,负数是按照补码计算的,最后的符号位也被统计
}
cout<<cnt;
return 0;
}
5.判断一个数是否2的N次⽅次
题⽬要求:⽤⼀个表达式,判断⼀个数X是否是2的N次⽅,即2,4,8,16……等,要求不可以⽤循环语句。
解析:2,4,8,16这样的数转化成⼆进制是10,100,1000,10000。
如果X减去1后(低⼀位并且⼆进制的每⼀位都是1),这个数与X做与运算,答案若是0,则X是2的N次⽅。
所以答案是:!(x&(x-1))
即可写成:if !(x&(x-1)) cout<<"yes"