劍指office--------二進位制中1的個數
阿新 • • 發佈:2020-07-30
題目描述
輸入一個整數,輸出該數32位二進位制表示中1的個數。其中負數用補碼錶示。 思路1:常規解法,位運算1 class Solution { 2 public: 3 int NumberOf1(int n) { 4 int ans=0; 5 int index=1; 6 while (index!=0){ 7 if (n&index) ans++; 8 index<<=1; 9 } 10 returnans; 11 } 12 };
思路2:利用二進位制特點
1 class Solution { 2 public: 3 int NumberOf1(int n) { 4 int count=0; 5 while (n){ 6 count++; 7 n=(n-1)&n; 8 } 9 return count; 10 } 11 };
n-1是將 二進位制n中的最右的1變成0的操作 ,例如 101000 減去1 的 100111
(n-1)&n 則是消除最右邊的1的操作 101000 & 100111 = 100000
即每操作一次就可以消除一個1。
用這個方法也可解下列問題
問題1: 判定一個整數是否是2的整數次方
如果是2的整數次方,那麼其的二進位制只有一個1, 即:if((n-1)&n==0) printf("YES\n");
問題2: 兩個整數n與m,問最少要改變多少個數字(對其二進位制操作),可以使n與m相等。
先對n與m取異或。在統計有多少個1即可。