位运算的妙用

做题中常用的位运算有以下几种:

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;

猜你喜欢

转载自www.cnblogs.com/Angel-Demon/p/10284403.html
今日推荐