1. 知识点
- 二进制要明白与(全一出一),或(有一出一),异或(或-与的部分)出一
- 负数补码:最高位为1 其余取反
1)写法
- 运算符左右移(运算效率高与除法,而已机器码就是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; } };
- 结果是运行超时 原因是输入是含有负数的其补码与移位机制导致了会一直补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; } };
- 利用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上的优化方案]
- 优化效果就出来了