关于牛客网《剑指offer》之二进制中1的个数疑惑?-已解决
代码思路为:用1作为一个flag,然后将这个flag左移并与n的每一位进行位与操作,即
n: 0 1 0 1 0 1 0 (不动)
flag: 1 (左移)
但是遇到一个编码问题,如下:
class Solution { public: int NumberOf1(int n) { int count = 0; unsigned int flag = 1; while(flag){ // if((n & flag) == 1) if(n & flag) //如果n与flag位与的结果为1 count++; flag = flag << 1; //将1左移 } return count; } };
为什么if(n & flag)不能使用if((n & flag) == 1),是因为位与的返回值不能与1比较吗?可是位与操作与0 1 与的结果:1&0 = 0, 0&1 = 0, 0&0 = 0, 1&1 = 1,返回值要么为0,要么是1,如果代码中flag 与 n按位与之后的结果是1,那么if(1==1)成立,则count++,否则if(0==1)返回的false,则count不操作,继续将flag左移。 我这样理解哪里出了问题呢?