计算二进制数中的1的数量

时间:2014-05-04 05:51:02

标签: c bit-manipulation bit bitwise-operators bitwise-and

此代码如何运作

例如

input: 5(101)
ouput: 2

功能是

scanf("%d", &a);
while(a)
{
oneina++;
a=a&(a-1);
}
printf("%d", oneina);

2 个答案:

答案 0 :(得分:1)

a-1a1中出现a(右起)0,该位右侧的所有位均为1 1。因此,当您按位时,他们一次从a删除一个{{1}}。

答案 1 :(得分:0)

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'