輸入一個整數,輸出該數二進制表示中1的個數。其中負數用補碼錶示

題目:輸入一個整數,輸出該數二進制表示中1的個數。其中負數用補碼錶示.

class Solution {
public:
     int  NumberOf1(int n) {
         int count=0;
          while(n!=0){
              count++;
              n=n&(n-1);
          
         return count;
     }
};

n&(n-1)的妙用  

今天無聊拿起《編程之美》看了下,發現原來n&(n-1)還有很多妙用。

原理:n與n-1的區別在於,對於n,從右向左數的第一個"1"開始一直到右,和n-1完全相反
n&(n-1)作用:將n的二進制表示中的最低位爲1的改爲0,先看一個簡單的例子:
n = 10100(二進制),則(n-1) = 10011 ==》n&(n-1) = 10000,此時正好去掉n的最右邊的一個1
可以看到原本最低位爲1的那位變爲0。
弄明白了n&(n-1)的作用,那它有哪些應用?
1. 求某一個數的二進制表示中1的個數
while (n >0 ) {
      count ++;
      n &= (n-1);
}


2. 判斷一個數是否是2的方冪
n > 0 && ((n & (n - 1)) == 0 )

發佈了29 篇原創文章 · 獲贊 20 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章