MySQL 8.0安裝
阿新 • • 發佈:2021-06-15
描述
輸入一個整數,輸出該數32位二進位制表示中1的個數。其中負數用補碼錶示。
方法一:檢查二進位制每一位數字
我們通過右移操作消除第 i 位右邊的數字,通過與 1 操作消除第 i 位左邊的所有數字,對數字 n 重複32次這種操作就可以求得每一位的數字。
當我們要提取從右往左第3位數字時:
01101
>> 2 得到 00011
& 1 得到 00001
c++程式碼如下:
class Solution { public: int NumberOf1(int n) { int res = 0; for (int i = 0; i < 32; i++) res += (n >> i) & 1; return res; } };
python3解法思路相同,
# -*- coding:utf-8 -*-
class Solution:
def NumberOf1(self, n):
res = 0
for i in range(32):
res += (n >> i) & 1
return res
方法一切記不要只通過 >> 運算子進行操作,因為負數的右移操作會在數字最左端補 1 ,導致 n 始終不為0,造成無限迴圈。
方法二:通過位運算公式 n & (n - 1)
公式 n & (n - 1) 的作用是使 n 的二進位制形式的最右邊一個數字 1 變成 0
例如:
n = 001100
n - 1 = 001011
n & (n - 1) = 001000
每消除一個 1 計數一次,直到 n 變成 0,最後得到的計數就是 1 的個數。
class Solution {
public:
int NumberOf1(int n) {
int res = 0;
for (; n; n &= n - 1, res++);
return res;
}
};
python3與c++不同之處在於,c++中因為 n 是 32 位整數,所以當 n 為 -2147483648 時再減 1 會導致負數溢位(int 的範圍是 [-2 ^ 31, 2 ^ 31 - 1]),溢位之後得到正數與運算結果為 0 不會導致死迴圈。但是 python 中的數字沒有大小限制,在迴圈中減 1 後 n 依然為複數,n 始終不為 0 導致死迴圈。所以在 python 中需要先把 n 取成大正數。
# -*- coding:utf-8 -*-
class Solution:
def NumberOf1(self, n):
# write code here
res = 0
if n < 0: n &= 0xffffffff
while n:
res += 1
n &= n - 1
return res