首页 > 试题广场 >

异或

[编程题]异或
  • 热度指数:446 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
小度最近学了位运算,一直有着深入思考习惯的小度想到:怎么求从l到r中所有数字的异或和呢?
小度把这个问题交给了你, 希望你能帮帮他。

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


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

输入描述:
一行两个数表示


输出描述:
输出一个数表示l到r的异或和。
示例1

输入

2 4

输出

5

说明

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;
}

发表于 2021-07-17 10:31:28 回复(0)
一道数学题,可参考https://zhuanlan.zhihu.com/p/139949012
发表于 2023-03-11 13:26:51 回复(0)
let sc=readline();
let s1=sc.split(' ');
let res=parseInt(s1[0]);
for(var i= parseInt(s1[0])+1;i<=parseInt(s1[1]);i++)
    {
      res=res^i;
    }
print(res);
//console.log(res);为什么显示我超时了?
发表于 2022-09-13 09:26:23 回复(1)
{
  let newArr = readline().split(' ')
  let l = newArr[0]-0
  let r = newArr[1]-0
  let res = 0
  if(r != l){
    if(l % 2 == 1){
      res ^= l++
    }
    if(r % 2 == 0){
      res ^= r--
    }
    if(r > l){
      if(((r-l+1)/2) % 2 == 1){
        res ^= 1
      }
    }
  }
   
  console.log(res)
}
求问:我这个哪里错了,连第一个例子都过不了。。
发表于 2022-03-13 16:36:21 回复(0)

js怎么写啊,l和r一定要键盘输入吗,js貌似没有这个玩意呀 我的代码,没有管结果为0的异或,内存高点 ^_^ 望指教

let testBegin=2,testEnd=4;
function xor(begin,end) {
    let result = begin;
    if(begin>end) {
        new Error('开始大于结束,你在干神魔?')
    }else if(begin==end) {
        return result;
    }else {
        for(let i=begin+1;i<=end;i++) {
            result=i^result;
        }
        return result;
    }
}
console.log(xor(testBegin,testEnd));


编辑于 2021-10-22 17:58:26 回复(0)