题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
- 整型数占4个字节
- 负数的补码,等于其相反数的所有二进制位取反,然后加1。
位移运算子特性:
- 负数的补码最高位1,右移则在最高位补1而不是0。因此负数时要限定位移运算子使用次数。
1 | class Solution2: |
比较笨,但是对理解原码和补码很有用处。
- 非负数比较简单,循环除以2直到除尽,累加每轮循环之前2的余数。
- 负数的话,用长度为32的数组模拟其相反数的各个二进制位,然后各个二进制位取反,然后加1,最后统计这个数组里1的个数。
1 | class Solution1: |
一个性质:
- 把一个整数减去1,在和原整数做与运算,会把该整数二进制的最右边一个1变成0。
- 用与运算的结果替换掉原整数,可以再次进行上述操作。而一个整数的二进制有多少个1,就可以进行多少次这样的操作,使得与运算结果为0。
1 | class Solution: |