关于异或的速算公式讨论(备忘)

本文探讨了1^2^...^N的异或速算公式,并通过二进制特性进行了证明。文中提供了高效的计算方法,能显著提升大数运算效率。

(我在这里参与讨论了下异或算法的相关问题,写下来作为备忘)

 

总结和证明一下1^2^3^...^N的速算公式:

不难证明以下两个异或公式(简要起见在此不作证明):
0^N = N
N^N = 0

所以有:
1^2^...^N = 0^1^2^...^N
即只要得出0^1^2^...^N的速算公式即为1^2^...^N的公式

又因为:
0^1^2^3 的二进制形式为:
0^1^10^11 = 0
4^5^6^7的二进制形式为:
100^101^110^111 = 0
(即:0^1^2^3^4^5^6^7 = 0)
根据异或的运算规则(相同为0,不同为1)及二进制的特性(每4位即可使二进位中的01交换一次,请自行试验)可知,0^1^2^...^N中从0开始每隔4位即会出现一个结果0

现假设运算至第i位时得到结果0,即:
0^1^...^i = 0

(i+1)%4=0
即只要(i+1)%4=0则:
0^1^...^i = 0
也就有:
0^1^...^i^(i+1) = i+1 (因为:0^N = N)

根据以上总结速算方法(用程序表示了,实测在N比较大时能提高不少效率):

ContractedBlock.gif ExpandedBlockStart.gif Code
    public static int GetXorValue(int N){
        
        
if(N%4==0return N;
        
        
if(N<4)
        {
            
int result=N;
            
for(int i=1;i<N;i++)
            {
                result 
= result^i;
            }
            
return result;
        }
        
else
        {
            
switch(N%4)
            {
                
case 1:
                    
return (N-1)^N;
                
case 2:
                    
return (N-2)^(N-1)^N;
                
case 3:
                    
return 0;
                
default:
                    
throw new Exception("Error");
            }
        }
    }
posted on 2009-07-23 18:07 BoolYang 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/XiaoG/archive/2009/07/23/1529617.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值