做题中常用的位运算有以下几种:
1、判断奇偶性
if (n & 1) { printf("偶数"); } else { printf("奇数"); }
常用于快速幂和其他判断奇偶性的地方
2、乘除2的整次幂
scanf("%d%d", &n, &m); // 输出n乘2的m次方 printf("%d", n << m);
线段树求左儿子可以用 id << 1得到,同理除2的整次幂也可以用右移运算符
scanf("%d%d", &n, &m); // 输出n除2的m次方 printf("%d", n >> m);
3、在一个数组中有n个数出现两次,还有1个数出现1次,求出现了一次的那个数
int ans = 0; for (int i = 0; i < 2 * n + 1; i++) { ans ^= arr[i]; } printf("%d", ans);
这个做题中也有用到过,3和4都是利用两个相同的数异或等于0实现的。
4、不开辟新空间交换a和b的值
a ^= b; b ^= a; a ^= b;
a ^= b之后a = a ^ b; b = b;
b ^= a之后a = a ^ b; b = b ^ a ^b = a;
a ^= b之后a = a ^ b ^ a = b; b = a;