异或 | 算法

119 阅读1分钟

题目: 小度最近学了位运算,一直有着深入思考习惯的小度想到:怎么求从l到r中所有数字的异或和呢?
小度把这个问题交给了你, 希望你能帮帮他。

异或指的是按位异或:
遵循二进制位相同取0,相异取1,例如


则x和y的按位异或结果为

输入描述:
一行两个数表示
输出描述:
输出一个数表示l到r的异或和。
输入例子1:
2 4
输出例子1:
5
例子说明1:
010 xor 011 xor 100 = 101
#include<bits/stdc++.h>
using namespace std;
 
long xorSum(long l, long r) {
    if (l == r) return l;
    long res = l % 2 ? l++ : 0;  // 第一个为奇数则取出计算
    res ^= r % 2 ? 0 : r--;      // 最后一个为偶数则取出计算
    res ^= (r - l + 1) / 2 % 2;
    return res;
}
 
int main() {
    long l, r;
    cin >> l >> r;
    cout << xorSum(l, r) << endl;
    return 0;
}