題目:給出一個整數,求出這個數轉換成二進制中出現1的個數
思路:n&(n-1) 可以消掉末尾的一個1,循環直到0爲止
常規解法不應該使用n來作爲右移,負數右移0x80000000變成0xC000000
C = 1100 8 = 1000
function f(n){
let i = 0;
while(n!=0){
n = n&(n-1)
i++;
}
return i;
}
延伸:判斷一個整數是不是2的整數次方
2的整數次方的二進制只有一個位是1
n&(n-1) == 0 則能判斷
延伸2:9個數分別在1-10中,但是缺失了一個數字,找出缺失的這個數
比如5,4,3,6,7,8,9,1,2 缺少了10.
function f(arr,n){
let sum = 0;
arr.forEach(item=>{
sum^=item;
});
let sum2 = 0;
for(let i = 1;i<=n;i++){
sum2 ^= i;
}
return sum^sum2;
}
因爲自己和自己異或是0 0和自己異或是本身,所以異或可以解
這題也可以使用累加之後相減也能解決。
延伸3:一個整數數組,有兩個整數是奇數個數,其他的個數都是偶數個數 求出這兩個奇數個數的數
比如:[1,2,3,1] 2,3個數爲奇數個
function f3(arr){
let sum = 0;
arr.forEach(item=>{
sum^=item;
})
let t = sum&(-sum);//n & -n 可以得到右邊第一個1
let sum2 = 0;
sum = 0;
arr.forEach(item=>{
if((item&t) == 0){
sum^=item
}else{
sum2^=item
}
})
console.log(sum,sum2);
}