劍指offer 15 二進位制中1的個數

2021-08-20 19:42:15 字數 1947 閱讀 2376

位運算:

左移運算子m《例如:

00001010<<2=00101000

10001010<<3=01010000

右移運算子與左移類似,但右移時處理最左邊位時稍微複雜:

1、如果數字是乙個無符號數值,則用0填補最左邊的n位

2、如果數字是乙個有符號數值,則用數字的符號填補最左邊的n位

00001010>>2=00000010    正數,用0填補最左邊的n位

10001010>>3=11110001    負數,用1填補最左邊的n位

題目:請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中1的個數。例如:把9表示成二進位制是1001,有2位是1.因此輸入9,該函式輸出2.

class solution 

return count;

}};

問題:把整數右移一位和把整數除以2在數學上是等價的,那上面的**中,可以把右移運算換成除以2嗎?

答案:不可以,除法的運算效率比移位運算要低太多,在實際程式設計中盡可能使用移位運算子代替乘除法

還有避免程式陷入死迴圈,我們一般不直接移動整數,因為負數右移會陷入死迴圈。

我們可以採用使1移位,判斷當前位是否是1,嗯,這真的是乙個好方法。

下面還有更高效的方法

思路:

我們發現將乙個整數減去1,再和原來的整數做位&運算,會把該整數最右邊的1變成0。

因此乙個整數的二進位制中有多少1,它就可以做多少次這樣的運算。

很多二進位制問題都可以用這種方法計算。

舉例:

1、1100,減一後為1011,1011&1100=1000

2、1000,減一後為0111,0111&1000=0000

**:

class solution 

return count;

}};

1、用一條語句判斷乙個整數是不是2的整數次方。

乙個整數如果是2的整數次方,那麼他的二進位制表示中有且只有一位是1,而其他所有位都是0.

根據前面的分析,把這個整數減去1之後再和它自己做與運算,這個整數中唯一的1就會變成0

2、輸入兩個整數 m和n, 計算需要改變m的二進位制表示中的多少位才能得到n。

比如10的二進位制表示為1010,13的二進位制表示是1101,則需要改變1010中的3位才能得到1101.

思路:

第一步:求這兩個數的異或

第二步:統計異或結果中1的位數,就又回到了前面的解法。

思路:考慮乙個普通的加法計算:5+17=22

在十進位制加法中可以分為如下3步進行:

1. 忽略進製,只做對應各位數字相加,得到12(個位上5+7=12,忽略進製,結果2);

2. 記錄進製,上一步計算中只有個位數字相加有進製1,進製值為10;

3. 按照第1步中的方法將進製值與第1步結果相加,得到最終結果22。

下面考慮二進位制數的情況(5=101,17=10001):

仍然分3步:

1. 忽略進製,對應各位數字相加,得到10100;

2. 記錄進製,本例中只有最後一位相加時產生進製1,進製值為10(二進位制);

3. 按照第1步中的方法將進製值與第1步結果相加,得到最終結果10110,正好是十進位制數22的二進位制表示。

接下來把上述二進位制加法3步計算法用位運算替換:

第1步(忽略進製):0+0=0,0+1=1,1+0=0,1+1=0,典型的異或運算。

第2步:很明顯,只有1+1會向前產生進製1,相對於這一數字的進製值為10,而10=(1&1)<<1。

第3步:將第1步和第2步得到的結果相加,其實又是在重複上述2步,直到不再產生進製為止。

源**:

class solution   

};

參考:

劍指Offer 15 二進位制中1的個數

面試題15 二進位制中1的個數 題目 實現乙個函式,輸入乙個整數,輸出該數二級制表示中1的個數。例 把9表示成二進位制是1001,有2位是1。因此如果輸入9,則該函式輸出2。最直接的思路 從低位開始向高位逐一比較是否為1,並計數。時間複雜度 o n num的二進位制位數 空間複雜度 o 1 利用二進...

劍指offer 15 二進位制中1的個數

解題思路一 最佳方法 把乙個整數減去1,再和原整數做 與運算 會把該整數最右邊的1變成0。那麼乙個整數的二進位制中表示中有多少個1,就可以進行多少次這樣的操作。class solution def hammingweight self,n int int res 0 while n res 1 n ...

劍指 Offer 15 二進位制中1的個數

題目 請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中 1 的個數。例如,把 9 表示成二進位制是 1001,有 2 位是 1。因此,如果輸入 9,則該函式輸出 2。示例 1 輸入 00000000000000000000000000001011 輸出 3 解釋 輸入的二進位制串 0000000...