c++中>>,&運算子的使用
阿新 • • 發佈:2020-12-20
本人學習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&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;
}
};
好了,文章到這裡就結束了,本人也是剛剛開始刷題,很多東西也不懂,希望能和各位一起進步。最後,如果文中有錯誤;還請不吝賜教。