C++ 面试题求解

xuci9876 2010-03-02 10:38:15
一道与或非的题
代码为
# include <iostream>
# include <string>

using namespace std;

main()
{
int count = 0;
int m = 9999;

while(m)
{
count++;
m = m&(m-1);
}

cout<<count;
}

结果是8,但是我不知道为什么,while(m)是一个什么条件呢?我怎么感觉是9999啊

另:!是非么?
...全文
166 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
F7300502 2010-03-04
  • 打赏
  • 举报
回复
jf,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
mtlojm 2010-03-03
  • 打赏
  • 举报
回复
m = m&(m-1) ==> m-- 也就是循环m次。
yn1088 2010-03-03
  • 打赏
  • 举报
回复
m的逻辑值为真时,执行循环语句;
m的逻辑值为假时,(即m=0);结束循环。
na2650945 2010-03-03
  • 打赏
  • 举报
回复
引用 3 楼 milkylove 的回复:
while(m)
{
count++;
m = m&(m-1);
}

这是经典的计算一个二进制数中1的个数的方法。

学习啦。
shangqiu100 2010-03-03
  • 打赏
  • 举报
回复
这个问题我曾经分部调试运行过,功能就是来计算一个二进制数中1的个数
hust_zhangxiaowei 2010-03-02
  • 打赏
  • 举报
回复
! 就是取反
正数或者负数的! = 0
0的 ! = 1
dubiousway 2010-03-02
  • 打赏
  • 举报
回复
,while(m)是一个什么条件
只要m 不是0,就可以循环
我怎么感觉是9999啊
m&(m-1),& 运算不明白查书。
因为在此过程中,到了第8次循环的时候,m 很凑巧成了8192,就是2的13次幂,
(2^13) & (2^13-1) 自然是0

!是非么?
是(就是取反,非变不非;不非变非)
brookmill 2010-03-02
  • 打赏
  • 举报
回复
把每次循环的m输出看一下。再把9999换成其他的数试试
while(m)
{
cout << hex << m << endl; //********************
count++;
m = m&(m-1);
}

cout << hex << m << endl; //********************
cout <<count << endl;
ThinkInAI 2010-03-02
  • 打赏
  • 举报
回复
while(m)等价于
while((BOOL)(m))默认转换了,
BOOL(9999) 是非0的,因此为真
失落的凡凡 2010-03-02
  • 打赏
  • 举报
回复
while(m)
{
count++;
m = m&(m-1);
}

这是经典的计算一个二进制数中1的个数的方法。
itxuls 2010-03-02
  • 打赏
  • 举报
回复
& 是把2个二进制的某位均为1时的1,否则为0 再把值赋予 m
最终 m为0时 跳出while
brookmill 2010-03-02
  • 打赏
  • 举报
回复
这是在算9999(0x270f)转换成二进制之后有几个1
关键在于m = m&(m-1); 每次做这个动作都会把最右边的一个1变成0,直到所有的1都变成0。
while(m)就是 while(m!=0)

64,282

社区成员

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

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