位運算-011-二進制中1的個數

題目描述

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

分析

  • 解法一:python對整數二進制表示,由於它自身語言的特殊性,對負數的二進制表示也是比較特殊的。
>>> bin(5)
'0b101'
>>> bin(-5)
'-0b101'
>>> bin(-5 & 1)
'0b1'
>>> bin(-5 & 3)
'0b11'
>>> bin(-5 & 7)
'0b11'
>>> bin(-5 & 15)
'0b1011'
>>> 1<<80
1208925819614629174706176

可以看出python對負數的二進制表示結合符號進行表示,但是負數進行位運算時,如上面所示,根據大數的二進制位數負數進行補碼錶示進行運算。

從最後一條測試代碼也可以看出python大數沒有溢出

  • 解法二:根據這條結論可知:對於數值n,將n - 1後再和n相與,得到的值相當於將n從右邊數的第一個1變成0。n的二進制表示中有多少個1,就能變多少次。實現代碼如下,時間複雜度優化爲O(n中1的個數)

但是python語言的特殊性,負數的補碼的表示沒有溢出,因此利用C語言編程。

代碼

# -*- coding:utf-8 -*-
class Solution:
    def NumberOf1(self, n):
        # write code here
        return bin(((1 << 32) - 1) & n).count('1')
class Solution {
public:
     int  NumberOf1(int n) {
         int count = 0;
         while (n!=0){
             count += 1;
             n = n & (n-1);
         }
         return count;
     }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章