Part 1 位运算。
1.按位与 & and
若两个数二进制对应的某一位都为1,返回值的该位才为1.
int a(int x){
return x&1;
}
用来判断奇偶。x&1若返回1,则代表x为奇数,反之。
树状数组的一个应用:
int lowbit(int x){
return x&(-x);
}
若x为0,则返回0;
若x为奇数,返回1;
若x为偶数,返回一个最大的2的次方因子。
用它可以取出二进制转换后的所有1。
2.按位或 | or
若两个数二进制后有一个数对应的某一位为1,返回值的该位就为1
3.按位异或 ^ xor
若两个数二进制后对应的某一位相同,则返回值的该位为1,否则返回值的该一位为0
4.按位取反 ~ not
若两个数二进制后对应的某一位相同,则返回值的该位为0,否则返回值的该一位为1
5.左移 shl <<
eg: a<< b 表示把a转为二进制后左移b位
若a<<1 则表示 a=a*2;
若1<< a 则表示求2^a
6.右移 shr >>
eg:a>> b 表示把a转为二进制后左移b位
若a>>1 则表示 a=a/2;
Part 各种乱七八糟实用不实用的技巧
求某个数转化为2进制后1的个数:
int count(int x){
int cnt=0;
while(x){
cnt++;
x&=(x-1);
}
return cnt;
}
把右数第k位变为1:
int modify1(int x,int k){
return x|(1<<k-1);
}//把右数第k位变为1
把右数k位变成1:
int modify2(int x,int k){
return x|(1<<k)-1;
}//把末k位变成1
把右数第k位变为0:
int modify3(int x,int k){
return x&~(1<<k-1);
}//把右数第k位变成0
把右数k位变为1:
int modify4(int x,int k){
return x&~((1<<k)-1);
}//把右数k位变成0
把右数第k位取反:
int modify5(int x,int k){
return x^(1<<k-1);
}//末数第k位取反
取末k位:
int modify6(int x,int k){
return x&((1<<k)-1);
}//取末k位
取右数第k位:
int modify7(int x,int k){
return x>>(k-1)&1;
}//取右数第k位