# Maximizing XOR

先来几个例子:

000100
101000

这两个数字范围内能构成的最大XOR是 111111, 我们可以选择 100000011111这两个数构成。

这就启发我们要从高位到低位找第一个L和R不同的比特位,从这位开始就所有比特位均为1就是我们能找到的最大XOR值

function maximizingXor(l: number, r: number): number {
    const strR = r.toString(2)
    const strL = padStart(l.toString(2),strR.length);
    for(let i=0;i<strL.length;i++){
        if(strR[i] !== strL[i]){
            return 2**(strR.length-i)-1
        }
    }
    return 0
}
function padStart(s:string,targerL:number):string{
    return ' '.repeat(targerL-s.length)+s;
}

这个是我最开始的实现,转换成字符串寻找第一个不同的比特位。

function maximizingXor(l: number, r: number): number {
    return (1 << (32 - Math.clz32( l ^ r) ) ) - 1
}

这个是网友给的一个答案,寻找第一个高位不同位采用XOR运算。Math.clz32会返回一个数字在转换成 32 无符号整形数字的二进制形式后,开头的 0 的个数