这段代码是如何工作的
例如
input: 5(101)
ouput: 2
功能是
scanf("%d", &a);
while(a)
{
oneina++;
a=a&(a-1);
}
printf("%d", oneina);
这段代码是如何工作的
例如
input: 5(101)
ouput: 2
功能是
scanf("%d", &a);
while(a)
{
oneina++;
a=a&(a-1);
}
printf("%d", oneina);
a-1
是a
第一个1
(从右边开始)出现在a
as0
和该位右侧的所有位 as 1
。因此,当您按位计算它们时,您一次删除1
一个a
。
scanf("%d", &a); // a = 0111b (7)
while(a) // a = 0111b (7) : TRUE
oneina++; // oneina 0 --> 1
a=a & (a-1); // a = 0111b (7) & 0110b (6) = 0110b (6)
while(a) // a = 0110b (6) : TRUE
oneina++; // oneina 1 --> 2
a=a & (a-1); // a = 0110b (6) & 0101b (5) = 0100b (4)
while(a) // a = 0100b (4) : TRUE
oneina++; // oneina 2 --> 3
a=a & (a-1); // a = 0100b (4) & 0011b (3) = 0000b (0)
while(a) // a = 0000b (4) : FALSE
printf("%d", oneina); // '3'