《劍指offer》(面試題10) 二進位制中1的個數

2021-08-15 05:35:43 字數 1219 閱讀 6639

位運算

位運算是把數字用二進位制表示之後,對每一位上 0 或者 1 的運算。

因為位運算總共只有五種運算:與,或,異或,左移和右移

與(&) 0&0=0     1 & 0 = 0     0 & 1 = 0     1 & 1 = 1

或(|)   0 | 0 = 0     1 | 0 = 1     0 | 1 = 1     1 | 1 = 1

異或(^)     0^0=0     1^0=1     0^1 = 1     1 ^ 1 = 0

左移運算子 m << n 表示把 m 左移 n 位。

左移 n 位 的時候,最左邊的 n 位將被丟棄,同時在最右邊補上 n 個 0.比如:

00001010 << 2 = 00101000

10001010 << 3 = 01010000

右移運算子 m >> n 表示把 m 右移 n 位。

如果數字原先是乙個正數,則右移之後在最左邊補 n 個 0;如果數字原先是負數,則右移之後在最左邊補 n 個 1.

00001010 >> 2 = 00000010

10001010 >> 3 = 11110001

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

解題思路:

方法一:用1(迴圈左移)與n的每一位進行位與,來判斷1的個數;注意,如果用n進行迴圈右移,一定要注意負數的情況,因為如果是負數,n右移之後高位補位為1,如果一開始不對n加以判斷和處理,就會進入死迴圈。

方法二:目前我認為最優的解。n=(n-1) & n; 

舉個栗子:乙個二進位制數n為1100,那麼n-1為1011,1011&1100=1000,我們會發現,這樣操作之後,相當於把n最右邊的乙個1變為0,那麼乙個整數的二進位制有多少個1,就可以進行多少次這樣的操作。

方法三:python的解法給了我另一種思路,為什麼不用位數作為迴圈終止條件呢?

python **實現:

# -*- coding:utf-8 -*-

class solution:

def numberof1(self, n):

# write code here

return sum([(n>>i & 1) for i in range(0,32)])

用一條語句判斷乙個整數是不是 2 的整數次方。乙個整數如果是 2 的整數次方,那麼它的二進位制表示中有且只有一位是 1,而其他所有位都是 0。

劍指Offer 面試題10 二進位制中1的個數

請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中1的個數。例如把9表示成二進位制是1001,有2位是1.因此如果輸入9,該函式輸出2.注意 整數和負數以及0的區別,這是由儲存機制決定的。分析 將輸入的整數依次右移並與1相位與!源 如下 includeusing std cout using st...

劍指offer面試題10 二進位制中1的個數

題目 請實現乙個函式,輸入乙個整數,輸出該二進位制表示中1的個數。例如把9表示成二進位制是1001,有2位是1,因此如果輸入9,該函式輸出2。常規的解題思路 可以把n和1做與運算,如果結果為1,那麼n的最後一位為1,否則為0,然後n右移1位,再和1做與運算,直到判斷完n的所有位。int statis...

劍指offer 面試題10 二進位制中 1 的個數

題目 請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中 1 的個數。例如把 9 表示成二進位制是 1001 有 2 位是 1,因此如果輸入 9,函式輸出 2.這個題本來我的思路是模擬十進位制的規則,設定乙個計數變數count,初始值為0。然後用給的整數數和2進行取餘操作,結果只有兩種可能 0或1...