位运算-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;
     }
};
发布了219 篇原创文章 · 获赞 85 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/z_feng12489/article/details/103352404