c++ - 你如何找到 l 到 r 范围内所有整数的异或,其中 -(10^18) <= l,r <= 10^18?
问题描述
我知道这就是当 1 <= l,r <= 10^18 时您将如何实现它,但是您将如何处理负数?
long long int xorf(long long int n){
long long int mod=n%4;
switch(mod){
case 0:return n;
break;
case 1:return 1;
break;
case 2:return n+1;
break;
case 3:return 0;
break;
}
int main(){
long long int l,r;
long long int xo=0;
cin>>l>>r;
xo = (xorf(l-1)^xorf(r));
cout<<xo<<endl;
}
解决方案
如果 n >= 0,那么(如您所说)1 ^ 2 ^ ... ^ n
可以通过以下方式计算:
long long PositiveXor(long long n){
switch (n % 4){
case 0: return n ;
case 1: return 1 ;
case 2: return n+1 ;
case 3: return 0 ;
}
}
类似地,如果n < 0
,则n ^ (n+1) ^ ... ^ -1
可以通过以下方式计算:
long long NegativeXor(long long n){
switch ((-n) % 4){
case 0: return 0 ;
case 1: return n ;
case 2: return 1 ;
case 3: return n-1 ;
}
}
(这假设 2 的补码表示。)
所以如果l >= 0
,答案是PositiveXor(r) ^ PositiveXor(l-1)
;如果l < 0
和r >= 0
,答案是NegativeXor(l) ^ PositiveXor(r)
。我将把第三种情况 ( r < 0
) 留给你。
推荐阅读
- oracle - Oracle 错误:值大于该列允许的指定精度
- bpf - BPF crc32 奇怪的错误:最后一个 insn 不是退出或跳转
- node.js - Nodejs API 在 localhost 中回复 JSON,但相同的 API 调用,在部署 heroku 时回复空 JSON
- firebase-dynamic-links - Firebase 动态链接可以用于通用应用邀请和特定页面邀请以跟踪推荐吗?
- c# - 使用范围运算符给出错误预定义类型“System.range”未定义或导入
- ethereum - 使用数组中数百个预填充结构创建 Solidity 合约的 Gas 问题
- python - 如何导出 csv 或文本文件中的所有链接?
- c# - 将项目转换为 NETSDK 格式后表单中的资源异常
- python-3.x - 多台计算机通信 - multiprocessing.Listener,确保端口保持可用?
- spring - 在 @SpringBootTest 中自动装配时,WebTestClient 为空