看到這個問題我們的第一反應就是根據二進位制的位直接統計,這也是我已開始想到的,於是有了如下**這份**的邏輯很清晰,就是將這個數慢慢的移,每一位都進行判斷最終得出結果,乍一看沒什麼錯誤。並且進行測試會發現對於正整數它執行的非常好,沒有什麼錯誤,但是我們嘗試一下負整數就會發現他有巨大的問題。
這裡首先要提一下,計算機對負數的儲存是按照其正數的補碼表示的,所以進行這種簡單的移位判斷就不可避免的會出現錯誤。這裡我們就要提到第二中解法,這種方法不金額以解決負數的問題,而且可以提高演算法的效率。先看**:
這種解法的精髓就在
這個操作上面,我們首先要考慮x和x-1的二進位制的差別在哪,我們列出幾個
從這些例子我們不難發現,這兩個數存在著這麼乙個關係:x的最後乙個一變成了零,其後(可能沒有)的零變成了一。於是我們可以發現只要將兩個數進行與操作,那麼最後乙個一以及它後面的就都置零了,通過判斷可以進行多少次這樣的操作就可以知道有多少個一。
判斷有多少零隻需要將判斷改一下就好。
整數的二進位制表示
目錄總結 整數的二進位制表示,需要區分正整數和負整數來看。看正整數的二進位制表示,就要先了解一下位權。十進位制 二進位制都有位權。以 123 為例 123 1 10 2 2 10 1 3 10 0。每個位置的位權都不一樣,十進位制從右到左,以 1 開始,依次乘 10 也就是說第 1 位為 1 第 2...
逆轉乙個整數的二進位制表示問題
解法一 這個容易理解。解法一 define unsigned bits count 32 unsigned int bitrev3 unsigned int input 解法二 第一行 為奇偶位相互交換 第二行為以兩位為一單元,奇偶單元進行交換 第三行為以四位為一單元,奇偶單元進行交換 第四行為以八...
求逆轉乙個整數的二進位制表示
解法一 這個容易理解。cpp view plain copy 解法一 define unsigned bits count 32 unsigned int bitrev3 unsigned intinput 我的格式,先不考慮符號問題 int reverse int n return ret 解法二...