题目:
小度最近学了位运算,一直有着深入思考习惯的小度想到:怎么求从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;
}