1. 程式人生 > 其它 >c++中>>,&運算子的使用

c++中>>,&運算子的使用

技術標籤:C++c++c語言c演算法後端程式語言

  本人學習C語言時,瞭解到了<</>>(左移/右移)運算子,還有&(按位與)運算子,但是從來沒有用過。刷leetcode時碰到了一個沒見過的資料型別uint32_t,覺得新奇就查了一下。

放一下原題目:
  請實現一個函式,輸入一個整數(以二進位制串形式),輸出該數二進位制表示中 1 的個數。例如,把 9 表示成二進位制是 1001,有 2 位是 1。因此,如果輸入 9,則該函式輸出 2。

   熟悉>>,&這兩個運算子的話,這個題目就不難。相信也有挺多小白像我一樣,第一眼被 u i n t 32 _ t \color{blue}{uint32\_t}

uint32_t這個資料型別嚇到了。

  其實uint32_t和int差不多,int是32位,也就是四個位元組的整型,uint32_t也可以理解為32位整型,區別就在於int最高位是符號位,uint32_t是無符號整型,表示範圍是從0~2^32-1,在用法上,基本可以等同於int。

  那在這裡直接把資料型別等同於int,這個題要怎麼做呢,這就要用到標題提到的兩個運算子了。

解 法 一 : \color{red}{解法一:} :
  利用n&000···001,也就是n&1來判斷最後一位是否為1,顯而易見,若最低位為1,則n&1=1,反之n&1=0。

class Solution {
public:
    int hammingWeight(uint32_t n) {
        int cnt=0;//用來記錄1的個數
        while(n!=0){
            cnt++;
            n+=n&1;判斷最後一位是否為1
            n>>=1;//n右移一位
        }
        return cnt;
    }
};

解 法 二 : \color{red}{解法二:} :
  利用n&n-1來消去n中最後一個1,這裡假設
   n=0010 0100

則 n-1=0010 0011
  n&n-1=0010 0000
可以看出只除去了最後一個1,其餘位置不變,n等於其他值也是一樣的,可以自行嘗試。

 class Solution {
public:
    int hammingWeight(uint32_t n) {
        int cnt=0;//用來記錄1的個數
        while(n!=0){
            cnt++;
            n+=n&n-1;//消去最後一個1
        }
        return cnt;
    }
};

  好了,文章到這裡就結束了,本人也是剛剛開始刷題,很多東西也不懂,希望能和各位一起進步。最後,如果文中有錯誤;還請不吝賜教。