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


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

    总结和证明一下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比较大时能提高不少效率):

    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");
                }
            }
        }
  • 相关阅读:
    Java集合类初始容量、加载因子、扩容增量
    并发之原子性、可见性、有序性
    多线程面试题
    MySQL引擎及选择
    SHA和MD5的Salt
    基于SSM的单点登陆05
    基于SSM的单点登陆04
    基于SSM的单点登陆03
    基于SSM的单点登陆02
    基于SSM的单点登陆01
  • 原文地址:https://www.cnblogs.com/XiaoG/p/1529617.html
Copyright © 2020-2023  润新知