# Sum vs XOR
这题首先要会用位运算实现加法
function helper (a:number, b:number):number {
if (a === 0) {
return b;
}
if (b === 0) {
return a;
}
return helper(a ^ b, (a & b) << 1);
}
注意到如果两个数的之和等于这两个数XOR,则两个数按位与为0,也就是说,X只能在L为0的比特位上为0或1,X只能在L为1的比特位上为0。于是问题就转换成了L的二进制表示中有多少个0。
function sumXor(n: number): number {
if(n === 0){
return 1
}
let count = 0;
const bininay = n.toString(2)
for(let i=0;i<bininay.length;i++){
if(bininay[i] === '0'){
count++
}
}
return 2**count;
}
这里有两个实现层面的小坑:
- L为0这个特殊的case,因为只有一个数,数零的个数不对的
- L的上限比较大,超过32位无符号数的表示范围,js用位运算处理零的个数会出错,需要转换为字符串计算零