注册 登录
编程论坛 C++教室

m&=m-1

TRUTH_2015 发布于 2016-02-29 17:00, 2776 次点击
程序代码:

#include<stdio.h>
int main()
{
    int n,m,s;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d",&m);
        s=0;
        while(m)
            m&=m-1,s++;
        printf("%d\n",s);
    }
    return 0;
}        

//          m & = m-1  这个是什么意思。
13 回复
#2
拉链2016-02-29 17:17
m=m&(m-1)
#3
rjsp2016-02-29 19:57
去掉最低位的一个1
#4
qq10235692232016-02-29 20:04
百度位运算“求与”。
#5
TRUTH_20152016-03-01 10:00
还是不懂,,求大神详细指教。。。
或给个网址链接。。。。
谢谢。。。
#6
qq10235692232016-03-01 10:19
回复 5楼 TRUTH_2015
http://
#7
wp2319572016-03-01 10:40
以下是引用rjsp在2016-2-29 19:57:52的发言:

去掉最低位的一个1

应该是 末位置〇  其他位不固定  最终就能看出来是个偶数  其他的看不出来啥
#8
rjsp2016-03-01 10:46
以下是引用wp231957在2016-3-1 10:40:22的发言:

 
应该是 末位置〇  其他位不固定  最终就能看出来是个偶数  其他的看不出来啥
以 m = xxxxxxxx1000 为例
m   = xxxxxxxx1000
m-1 = xxxxxxxx0111
两者and一下,得 xxxxxxxx0000,即去掉了最低位的1
#9
wp2319572016-03-01 10:54
19 & 18=18 去掉哪个1了  ??  如果去掉19的末位1 则变成 9了
#10
wmf20142016-03-01 10:59
0000000000011001        19
0000000000011000        18
--------------------------     
0000000000011000        18       是去掉末位啊,不知道怎么变成9的?求解9楼。
#11
wp2319572016-03-01 11:03
19=10011
18=10010
#12
rjsp2016-03-01 11:06
以下是引用wp231957在2016-3-1 10:54:37的发言:

19 & 18=18 去掉哪个1了  ??  如果去掉19的末位1 则变成 9了
我看懂了
我说的“去掉”是指变为0
你认为我说的“去掉”是指这一位没有了,左边的位顺次右移一位。
是我没说清楚
#13
wmf20142016-03-01 11:22
回复 11楼 wp231957
哦,我按16进制算去了。
#14
TRUTH_20152016-03-01 17:00
理解了,,,,,在二进制中,各位遵循1 & 1 = 1、 1 & 0 = 0、 0 & 0 = 0.
看这个很有帮助  http://
1