把一個整型數,提取最右側的1
int N=0000 1101 1000 1100
變成ans=0000 0000 0000 0100
ans=N&(~N+1)
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiIXZ05WZj91YpB3I2EzX4xSZz91ZsAzNfRHLGZkRGZkRfJ3bs92YsAjMfVmepNHL1AXbUxEerFVQClGVF5UMR9Fd4VGdsATNfd3bkFGazxycykFaKdkYzZUbapXNXlleSdVY2pESa9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLxQmNzUDZldTNyMzMjZmNhJGZzQDNiZ2YzcjN5czNwQ2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
應用:
一個數組中兩種數出現了奇數次,其餘的數都出現偶數次,找到并且列印這兩種數(最右側1的應用!)
假設兩種數是a和b,則兩種數異或的結果為ab,則數組所有數異或的結果為ab。
因為a!=b也就是a^b!=0,是以a和b某一位不相等。假設第8位不同,是以根據第8位為0和1,将數組中所有的數分為兩組。
将數組中第八位為1的數和 第八位為1其餘位都為0的數 異或,結果是a或者b(因為我們也不知道a和b誰的第八位為1)
随意一個數,輸出二進制中1的個數(最右側1的應用)
int count=0;
while(N!=0){
int rightOne=N&((~N)+1);
count++;
N^=rightOne;
}
return count;