1. 程式人生 > 其它 >Mysql重灌5.7版本

Mysql重灌5.7版本

描述

輸入一個整數,輸出該數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