《剑指offer》第11题——求一个数它二进制中1的个数

342 阅读1分钟

题目: 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 思路: 利用&运算

Java

package nowcoder;

public class S11_NumberOf1 {
    public int numberOf1(int n){
        int count = 0;
        /*while (n != 0 ) {
            if ((n & 1) == 1)
                count++;
            n = n >>> 1; //逻辑右移,符号位不动
        }
        return count;*/
        /* 利用flag左移来比较每一位
        int flag = 1;
        while (flag != 0){
            if ((n & flag) != 0)
                count++;
            flag = flag << 1;
        }
        return count;*/
        // n & (n-1),有一个1,n就减1,直到n为0
        while (n != 0){
            count++;
            n = n & (n-1);
        }
        return  count;
    }
    public static void main(String[] args){
        S11_NumberOf1 s11 = new S11_NumberOf1();
        System.out.print(s11.numberOf1(-32));
    }
}

Python

class NumberOf1:
    def numberOf1(self, n):
        return sum([(n >> i & 1) for i in range(0, 32)])
if __name__ == '__main__':
    test = NumberOf1()
    print(test.numberOf1(-32))