关于牛客网《剑指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左移。  我这样理解哪里出了问题呢?
全部评论
因为flag会每次左移一位判断n的次低位是不是1,而此时的n不一定为1,你可以将(n&flag)==1换成(n&flag) != 0,这样应该就满足你的本意了。大佬轻喷
点赞 回复 分享
发布于 2017-08-20 13:30
不是用  x&(x-1) 吗
点赞 回复 分享
发布于 2017-08-20 14:12
二楼是我的答案,楼主的答案是错误的原因是,flag和n的数据类型不一致造成的
点赞 回复 分享
发布于 2017-08-20 13:30
template <typename T> int shuyigeshu(T n) { int count=0; while(n) { if(n%2==1) count++; n=n/2; } }
点赞 回复 分享
发布于 2017-08-20 13:28
flag 与 n按位与之后的结果除了最开始可能为1,当你flag左移之后是不可能为1的吧
点赞 回复 分享
发布于 2017-08-20 13:23

相关推荐

04-10 11:56
如皋中学 Java
高斯林的信徒:双c9能简历挂的?
点赞 评论 收藏
分享
叶扰云倾:进度更新,现在阿里云面完3面了,感觉3面答得还行,基本都答上了,自己熟悉的地方也说的比较细致,但感觉面试官有点心不在焉不知道是不是不想要我了,求阿里收留,我直接秒到岗当阿里孝子,学校那边的房子都退租了,下学期都不回学校,全职猛猛实习半年。这种条件还不诱人吗难道 然后现在约到了字节的一面和淘天的复活赛,外加猿辅导。华为笔试完没动静。 美团那边之前投了个base广州的,把我流程卡麻了,应该是不怎么招人,我直接简历挂了,现在进了一个正常的后端流程,还在筛选,不知道还有没有hc。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务