天天看點

二進制最右側1及其應用

把一個整型數,提取最右側的1

int N=0000 1101 1000 1100

變成ans=0000 0000 0000 0100

ans=N&(~N+1)

二進制最右側1及其應用

應用:

一個數組中兩種數出現了奇數次,其餘的數都出現偶數次,找到并且列印這兩種數(最右側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的個數(最右側1的應用)
int count=0;
while(N!=0){
	int rightOne=N&((~N)+1);
	count++;
	N^=rightOne;
}
return count;