整数中含有1的个数?

DayThinking 2012-10-15 11:07:54
问题件代码。

#include "stdafx.h"
#include<iostream>
using namespace std;
int solution(int n);
int main(int argc, char* argv[])
{
cout<<solution(10)<<endl;
return 0;
}

int solution(int n)
{
int count=0;
int flag=1;
while (flag)
{
if((n&flag) ==1)//为嘛改写这样就可以呢:if(n&flag)
count++;
flag=flag<<1;
}
return count;
}
...全文
235 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lin5161678 2012-10-15
  • 打赏
  • 举报
回复
源代码 做错了
LZ改对了
lin5161678 2012-10-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

引用 2 楼 的回复:
if((n&amp;flag) ==1)
if(n&amp;flag)

两者的差别很明显

前者 n&amp;flag 只能是 1,才成立
后者 n&amp;flag 可以是1,2,3……,都成立,都是true

楼主这样取的是二进制的位的数,只能是1和0,所以if((n&flag)==1) 和if(n&……
[/Quote]

1110
1000
&
结果是
1000
你确定结果只能是1和0~~~~ 这个8 怎么解释
armsword 2012-10-15
  • 打赏
  • 举报
回复
if(n&flag) 表示n&flag不是0就行。

(n&flag) ==1 表示必须为0,不一样的。
yisikaipu 2012-10-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 5 楼 的回复:
引用 2 楼 的回复:
if((n&amp;amp;flag) ==1)
if(n&amp;amp;flag)

两者的差别很明显

前者 n&amp;amp;flag 只能是 1,才成立
后者 n&amp;amp;flag 可以是1,2,3……,都成立,都是true

楼主这样取的是二进制的位的数,只能是1和0,所以……
[/Quote]

是的,那里是个笔误,本来写1,2,4,8……的

否则我就说任何整数了
fjweigege 2012-10-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
如果非要改写,那么从逻辑上来说也是if((n & flag) == flag)这样才对。
[/Quote]
正解
fjweigege 2012-10-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
引用 2 楼 的回复:
if((n&amp;flag) ==1)
if(n&amp;flag)

两者的差别很明显

前者 n&amp;flag 只能是 1,才成立
后者 n&amp;flag 可以是1,2,3……,都成立,都是true

楼主这样取的是二进制的位的数,只能是1和0,所以if((n&flag)==1) 和if(n&f……
[/Quote]
我错了。。。应该是2的n次方。。。
fjweigege 2012-10-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
if((n&flag) ==1)
if(n&flag)

两者的差别很明显

前者 n&flag 只能是 1,才成立
后者 n&flag 可以是1,2,3……,都成立,都是true
[/Quote]
楼主这样取的是二进制的位的数,只能是1和0,所以if((n&flag)==1) 和if(n&flag)等价。。。
armsword 2012-10-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

if((n&flag) ==1)
if(n&flag)

两者的差别很明显

前者 n&flag 只能是 1,才成立
后者 n&flag 可以是1,2,3……,都成立,都是true
[/Quote]

+1
图灵狗 2012-10-15
  • 打赏
  • 举报
回复
如果非要改写,那么从逻辑上来说也是if((n & flag) == flag)这样才对。
yisikaipu 2012-10-15
  • 打赏
  • 举报
回复
if((n&flag) ==1)
if(n&flag)

两者的差别很明显

前者 n&flag 只能是 1,才成立
后者 n&flag 可以是1,2,3……,都成立,都是true
  • 打赏
  • 举报
回复
#include "stdafx.h"
#include<iostream>
using namespace std;
int solution(int n);
int main(int argc, char* argv[])
{
cout<<solution(10)<<endl;
return 0;
}

int solution(int n)
{
int count=0;
int flag=1;
while (flag)
{
if((n&flag) ==1)//flag的初始是0x0001,从最右边的一位开始判断是否为1
count++;
flag=flag<<1;//从右到左,依次判断n的某一位是否为1
}
return count;
}

DayThinking 2012-10-15
  • 打赏
  • 举报
回复
谢谢各位,特别是细心的fjweigege,我终于懂了,呵呵。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧