1. 知识点

  1. 二进制要明白与(全一出一),或(有一出一),异或(或-与的部分)出一
  2. 负数补码:最高位为1 其余取反
    1)写法
    图片说明
  3. 运算符左右移(运算效率高与除法,而已机器码就是0101.。。)
    1)左移
    图片说明
    2)右移(符号位填充)
    图片说明
    图片说明

    2. 解法1:和1做与运算 因为1只有一位 所以对应位就是最后一位

    图片说明
    class Solution {
    public:
      int  NumberOf1(int n) {
          int c=0;
          while(n)
          {
              if(n & 1)
                  c++;
              n=n>>1;
          }
           return c;
      }
    };
  4. 结果是运行超时 原因是输入是含有负数的其补码与移位机制导致了会一直补1导致死循环。
    图片说明

    2. 解法2:既然有负数 那我移动1好了

    class Solution {
    public:
      int  NumberOf1(int n) {
          int c=0,z=32;
          int flag=1;
          while(z--)
          {
              if(n & flag)
                  c++;
            flag=flag<<1;
          }
           return c;
      }
    };
    图片说明
  1. 利用unsigned int 32位做优化【哈哈哈居然没优化,提供一个思路也好】
    class Solution {
    public:
      int  NumberOf1(int n) {
          int c=0;
          unsigned flag=1;
          while(flag)
          {
              if(n & flag)
                  c++;
            flag=flag<<1;
          }
           return c;
      }
    };
    图片说明

    3. 解法3[剑指offer上的优化方案]

    图片说明
  2. 优化效果就出来了
    图片说明