15.位运算

题目:输入一个32位整数,输出该数二进制表示中1的个数。
注意:负数在计算机中用其绝对值的补码来表示。

求补码的方法:

  • 例如求-8的补码
  • 1.先求出-8的绝对值:8
  • 2.写出8的二进制表示:1000
  • 3.从右往左,碰到第一个1之后,剩下的位全部取反,32位操作系统中-8的表示就是:1111 1111 1111 1111 1111 1111 1111 1000

位运算:

  • 1111 & 1 = 1 拿1111的最后一位与1做与运算 所以结果为

其他补充:

  • C++中如果一个有符号的整数做位运算,例如向右移动1位,那么它会在最高位上补1。如果一个无符号整数做位运算,那么它会在最高位上补0。
  • 例如 (有符号整数)
    0000 0000 0000 0000 0000 0000 0000 0001 >> 1 =
    1000 0000 0000 0000 0000 0000 0000 0000
  • (无符号整数)
    1000 0000 0000 0000 0000 0000 0000 0001 >> 1 =
    0100 0000 0000 0000 0000 0000 0000 0000

根据以上信息,本题思路,先把有符号整数转换成无符号整数,不然会产生死循环,然后与1做&运算,统计个数。

class Solution {
public:
    int NumberOf1(int n) {
        unsigned int _n = n;
        int count = 0;
        while (_n)
        {
            if (_n & 1 == 1) count += 1;
            _n >>= 1;
        }
        return count;
    }
};

你可能感兴趣的:(15.位运算)