剑指offer:11.二进制中1的个数
https://github.com/PhillipHuang2017/SwordOffer 11.二进制中1的个数 题目描述 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 解题思路 负数用补码表示,所以运算方法和正数一样,无需做特殊考虑。 这里用到了一个很巧妙的运算方式,即 n & (n - 1) ,这个运算表示将最右边的1变成0,解释见下面 因为 n-1 表示将 n 最右边的1变成0,然后把那一位后面的0全都变成1,前面不变,因此如果用 n 和 n-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 ) : #