剑指offer:11.二进制中1的个数

馋奶兔 提交于 2020-02-12 19:44:59

https://github.com/PhillipHuang2017/SwordOffer

11.二进制中1的个数

题目描述

  • 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

解题思路

  • 负数用补码表示,所以运算方法和正数一样,无需做特殊考虑。
  • 这里用到了一个很巧妙的运算方式,即n & (n - 1),这个运算表示将最右边的1变成0,解释见下面
  • 因为n-1表示将n最右边的1变成0,然后把那一位后面的0全都变成1,前面不变,因此如果用nn-1做与运算的话,n原本最右边的1就变成了0 ,一直重复上面的过程直到n变为全0 。
  • 如果用Python的话,由于python的数据是动态的,可以认为是无限长的,存储的形式又是补码,因此负数就会有非常多的1,会导致无限循环,因此需要先用n = n & 0xffffffff代码把数据截取为32位,再进行操作。

代码

  • C++
class Solution {
public:
     int  NumberOf1(int n) {
         int count = 0;
         while(n){
             count++;
             n = n & (n - 1);
         }
         return count;
     }
};
  • Python方法1
class Solution:
    def NumberOf1(self, n):
        # write code here
        count = 0
        if n < 0:
            n = n & 0xffffffff  # 截断操作,因为python的数据是动态的,可以认为是无限长的
        while n:
            count += 1
            n = (n - 1) & n
        return count
  • Python方法2
class Solution:
    def NumberOf1(self, n):
        # write code here
        return sum([(n>>i & 1) for i in range(0,32)])

https://github.com/PhillipHuang2017/SwordOffer

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!