关于牛客网《剑指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

相关推荐

用微笑面对困难:只要你保证项目和获奖都是真的就行尤其是“对战,总负责人”啊这些套职,基本上队员,打杂的都这么写
点赞 评论 收藏
分享
09-30 15:27
已编辑
成都工业学院 企业文化
Morpheus_:候选人:还需要测验武力值?
投递腾讯等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务