博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
求1到n这n个整数间的异或值 (O(1)算法)
阅读量:6921 次
发布时间:2019-06-27

本文共 1243 字,大约阅读时间需要 4 分钟。

 

 

问题:求1nn个整数间的异或值,即 1 xor 2 xor 3 ... xor n

 

记 f(x, y) 为x到y的所有整数的异或值。

 

对 f(2^k, 2^(k+1) -1) (注意文章中的 ^ 表示的是“幂”,xor 表示“异或”,or 表示“或”):

2^k 到 2^(k+1) -1 这2^k个数,最高位(+k位)的1个数为2^k,

若 k >= 1,则2^k为偶数,将这2^k个数的最高位(+k位)去掉,异或值不变。

因而 f(2^k, 2^(k+1) -1) = f(2^k - 2^k, 2^(k+1) -1 -2^k) = f(0, 2^k -1)

因而 f(0, 2^(k+1) -1) = f(0, 2^k -1) xor f(2^k, 2^(k+1) -1) = 0 (k >= 1)

即 f(0, 2^k - 1) = 0 (k >= 2)

 

对 f(0, n)  (n >= 4) 设n的最高位1是在+k位(k >= 2),

f(0, n) = f(0, 2^k - 1) xor f(2^k, n) = f(2^k, n)

对2^k到n这n+1-2^k个数,最高位(+k位)共有 m = n+1-2^k 个1,去除最高位的1

 

当n为奇数时,m是偶数,因而 f(0, n) = f(2^k, n) = f(0, n - 2^k)

由于n - 2^k 与 n同奇偶,递推上面的公式,可得:f(0, n) = f(0, n % 4)

当 n % 4 == 1 时, f(0, n) = f(0, 1) = 1

当 n % 4 == 3 时, f(0, n) = f(0, 3) = 0

 

当n为偶数时,m是奇数,因而 f(0, n) = f(2^k, n) = f(0, n - 2^k)  or  2^k

也就是说,最高位1保持不变,由于n - 2^k 与 n同奇偶,递推上面的公式,

可得:f(0, n) = nn or  f(0, n % 4)   (nn为 n的最低2位置0)

当 n % 4 == 0 时, f(0, n) = n

当 n % 4 == 2 时, f(0, n) = nn or  3 = n + 1 (公式对 n = 2仍成立)

 

综上所述:

f(1, n)  =  f(0, n)  =

   n      n % 4 == 0

   1      n % 4 == 1

   n +1   n % 4 == 2

0      n % 4 == 3

 

代码:

unsigned xor_n(unsigned n)

{

 unsigned t = n & 3;

 if (& 1) return t / 2u ^ 1;

 return t / 2u ^ n;

}

作者:
出处:
本文采用 进行许可,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载于:https://www.cnblogs.com/Stomach-ache/p/4825728.html

你可能感兴趣的文章
oracle:检查操作系统版本: 必须是 XXX 未通过
查看>>
python中的行结构和缩进
查看>>
Linux 基于openssl的https服务配置
查看>>
磨刀不误砍柴工 建站前选好虚拟主机是关键
查看>>
sed命令小总结(一)
查看>>
遇到的vSphere Client无法连接vSphere server的问题
查看>>
我的友情链接
查看>>
Ubuntu 配置JDK
查看>>
八款开源 Android 游戏引擎 (巨好的资源)
查看>>
lnmp源码安装
查看>>
数据库事务基础知识
查看>>
javascript面向对象与原型
查看>>
SubVersion与MyEclipse整合
查看>>
ftp被动模式
查看>>
redis数据库安装配置
查看>>
英语学习网站
查看>>
C# 发送Http请求 - WebClient类
查看>>
Nagios监控平台搭建
查看>>
在F5上发布FTP应用
查看>>
在Exchange Server 2010中管理POP3和IMAP4协议访问
查看>>