位運算
位運算是把數字用二進位制表示之後,對每一位上 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...