位運算(一)劍指 15 二進位制中1的個數

2021-10-10 07:06:18 字數 1538 閱讀 6166

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

示例 1:

輸入:00000000000000000000000000001011

輸出:3

解釋:輸入的二進位制串 00000000000000000000000000001011 中,共有三位為 '1'。

示例 2:

輸入:9

輸出:2

解釋:輸入的不是二進位制串,但其二進位制表示為 1001 中,共有三位為 '1'。

與二進位制相關的題目容易聯想到位運算,如果只是單純的從進製轉換入手,很有可能就走了一條遠路。通過位運算中的移位(>><<)以及與或運算(&|)能夠很方便地實現一些功能。

按照常規思路來想可以用三步來解決這個問題:

(1)輸入乙個整數,需要判斷這個整數是否直接就是二進位制的形式。->(2);->(3)

(2)統計數字中1的個數

(3)將這個整數轉化為二進位制數,統計數字中1的個數

由於第(2)步與第(3)步中統計數字1的個數針對都是二進位制串而言,因此第(2)步可以封裝為乙個函式

//(1)判斷輸入數字n是否是二進位制串

bool

isbinary

(uint32_t n)

}return flag;

}

//(2)統計數字n中1的個數

intnumsone

(uint32_t n)

return nums_of_one;

}

前面兩步的函式有了,關鍵就是這個第(3)步,如果輸入的是乙個十進位制整數,怎麼把它轉成乙個二進位制數,目前思路就卡在了這裡,先記錄一下,回頭過來改一下。

主函式如下:

int

hammingweight

(uint32_t n)

return output;

}

劍指書上不僅考慮了正整數,還考慮了負數的情況,使用了移位運算來逐位判斷該整數的二進位制形式中存在多少位1。這就是高明之處,使用移位運算來避免了把十進位制數轉化為二進位制數

這裡存在兩種思路如下:

負數的原因,不能將整數右移,相對的我們使用二進位制1來左移,通過1的不斷左移,與整數n的各位相與,這樣就能避免負數不能右移的尷尬。

class

solution

return count;}}

;

在上面的運算中,想要完整的統計乙個uint32_t型別的整數,flag需要左移32次。

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

時間限制 1秒 空間限制 32768k 熱度指數 304381 輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。知識點 1 計算機中的符號數有三種表示方法,即原碼 反碼和補碼。三種表示方法均有符號位和數值位兩部分,符號位都是用0表示 正 用1表示 負 而數值位,三種表示方法各不相同...

二進位制位運算

與運算,6 3 2 或運算 6 3 7 異或運算 6 3 5 反碼 6 7 左移 3 2 12 3 2 2 12 右移 3 1 1 3 2 1 無符號右移 3 1 1 3 2 1 按位與,當兩位同時為1時才為1如 1 1 1 1 0 0 0 1 0 6 3相當於 0110 0011 0010 2 按...

二進位制位運算

一 按位與 位全為1,結果才為1 0 0 0 0 1 0 1 0 0 1 1 1 特殊用法 清零。如果想將乙個單元清零,就是使其全部二進位制位為0,只要與乙個各位都為零的數值相與,結果為零 取乙個數中的指定位。如x 10101110要取x的低4位,用x 00001111 00001110即可 二 按...