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

2021-07-28 19:32:04 字數 1119 閱讀 3470

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

常規的解題思路:

可以把n和1做與運算,如果結果為1,那麼n的最後一位為1,否則為0,然後n右移1位,再和1做與運算,直到判斷完n的所有位。

int statisticsnums(int n)

n=n>>1;

}return sum;

}

上面**當傳入的引數為正數,能夠返回正確的值,但傳入的引數為負數時,就會陷入死迴圈,函式沒有辦法返回值。原因分析:

我們來看一下左移和右移運算的法則:

左移(<

右移(>>):右移n位,低位捨棄n位,當數為正數時,高位補n個0,當數為負數時,高位補n個1。因為在計算機組成原理中,符號位1表示負數,符號位0表示正數。

舉兩個栗子:

1.3<<2

假設整數3為int型別,那麼它佔4個位元組,也就是有32位,表示如下:

左移兩位後結果應該是這樣:

3<<2=12

2.9>>1

9的二進位制位:

9右移1位:

9>>1=4

可以看出來,在數學意義上,左移n位代表乘以2的n次方,右移n位代表除以2的n次方。

我們再來看一下計算機組成原理中是如何表示乙個負數的。

在計算機中為了減少操作,一般用數的補碼來表示乙個數。

正數的補碼=原碼

負數的補碼=負數正值的原碼取反+1

比如計算-9的補碼過程:

所以-9的二進位制補碼用16進製表示為0xfffffff7,

回到上面的問題,假設給函式傳入的引數為-9,那麼當-9經過4次右移1位後,結果將變成

結果用16進製表示就是0xffffffff,所以程式最終會陷入死迴圈。

為了避免死迴圈的出現,我們可以不讓n移動,而每次讓1左移1位,這樣結果也是一樣的。

int statisticsnums(int n)

return sum;

}

劍指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.這個題本來我的思路是模擬十進位制的規則,設定乙個計數變數count,初始值為0。然後用給的整數數和2進行取餘操作,結果只有兩種可能 0或1...

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

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