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

2022-07-08 00:30:37 字數 939 閱讀 9255

題目描述

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

題目示例

輸入:
10

返回值:
2
解法分析解這道題需要了解原始碼、反碼和補碼的相關知識。

首先我們可以從右移操作入手,乙個整數若右移1,如果最右位是0,那麼相當於該整數除以2,如果最右位是1,那麼相當於先減1再除以2(其實就是看除以2之後是奇數還是偶數),因此我們可以由此得到演算法1;

但我們會發現,這樣會需要我們迴圈32次(因為該數表示為32位二進位制),有沒有更快的演算法呢?

當我們用乙個整數,去和比其小1的整數做與運算時,該整數最右位的1會變成0。比如6(1010)和5(1001)做與運算,結果是1000,可以發現1010最右側的1變成了0。我們可以使用這個方法來計算n包含幾個1,且運算次數與n中1的個數相同。此方法對以補碼表示的負數同樣適用。見演算法2。

**

演算法1:

1

function

numberof1(n)

212 n =math.floor(m);13}

14return

num;

15 }

演算法2:

1

unction numberof1(n)29

return

num;

10 }

執行結果

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

思路 如果乙個整數不為0,那麼這個整數至少有一位是1。如果我們把這個整數減1,那麼原來處在整數最右邊的1就會變為0,原來在1後面的所有的0都會變成1 如果最右邊的1後面還有0的話 其餘所有位將不會受到影響。舉個例子 乙個二進位制數1100,從右邊數起第三位是處於最右邊的乙個1。減去1後,第三位變成0...

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

輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。用1 1自身左移運算,其實後來就不是1了 和n的每位進行位與,來判斷1的個數 public class solution11 flag flag 1 return count public static void main strin...

《劍指Offer》11 二進位制中1的個數

題目 11.二進位制中1的個數 知識點 位運算 題目描述 輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。解題思路 解法一 這是我當時自己的思路,即通過除二取餘法來求輸入的十進位制數字的二進位制的每一位,再判斷其是否為一,當輸入數字為負數的時候,取其補碼 原數字取反加一 我使用的取...