无法理解部分代码(位操作)
Having trouble understanding a portion of code (bit operation)
我不明白如何计算二进制表示中 1 的个数。
我有我的代码,希望有人能帮我解释一下。
代码:
int count (int x)
{
int nr=0;
while(x != 0)
{
nr+=x%2;
x/=2;
}
return nr;
}
为什么要 while
?例如,如果我有 1011
,它不会停在 0?
为什么nr += x%2
?
为什么 x/=2
?!
第一个:
nr += x % 2;
想象一下二进制的 x:
...1001101
模运算符 returns 来自 a / b 的余数。
现在 x 的最后一位要么是 0,在这种情况下 2 总是以 0 余数进入 x,要么是 1,在这种情况下它 return 是 1。
如您所见,x % 2 将 return(如果最后一位是 1)为 1,从而将 nr 递增 1,或者不递增,在这种情况下 nr 不变。
x /= 2;
这会将 x 除以二,并且因为它是整数,所以舍去余数。这意味着二进制文件是
....10
它将找出 2 进入其中的次数,在本例中为 1。它有效地删除了二进制数的最后一位,因为在基数 2(二进制)中,2 进入数字的次数是与 'shifting' 下的所有内容一样 space (这是一个糟糕的解释,请询问是否需要详细说明)。这有效地 'iterates' 通过了二进制数,允许行即将检查下一位。
这将迭代直到二进制只是 1
,然后减半,舍弃余数,x 将等于 0,
while (x != 0)
在这种情况下退出循环,你已经检查了每一点。
还有:
'count` 可能不是最能描述函数的名称,请考虑将其命名为更能描述其用途的名称。
nr 将始终是大于或等于零的整数,因此您可能应该具有 return 类型 unsigned int
int count (int x)
{
int nr=0;
while(x != 0)
{
nr+=x%2;
x/=2;
}
return nr;
}
这个程序基本上给出了给定整数中设置位的数量。
例如,让我们从示例整数 11(二进制表示 - 1011
)开始。
第一个流程将进入 while
循环并检查数字是否为零。
while(11 != 0)
因为 11
不等于零,所以它进入 while
循环并且 nr
被赋值为 1 (11%2 = 1)。nr += 11%2;
然后它执行循环内的第二行 (x = x/2)。这行代码将值 5 (11/2 = 5 )
赋值给 x
.
一旦完成 while
循环体,它就会再次检查 x
是否等于 5,即 5 是否等于 0。
while( 5 != 0)
。
由于情况并非如此,因此流程第二次进入 while
循环,并且 nr
被分配了值 2 ( 1+ 5%2)
。
之后 x
的值除以 2 (x/2, 5/2 = 2 ) 并将 2 赋值给 x
。
同样在下一个循环中,while (2 != 0 )
,nr
加上(2 + 2%2),因为2%2为0,所以nr
的值仍然是2,x
的值在下一行减少到 1 (2/2)。
1不等于0所以第三次进入while循环
在 while 循环的第三次执行中 nr
值增加到 3 (2 + 1%2)。
之后 x
的值减少到 0 ( x = 1/2 which is 0
).
由于未通过检查 (while x != 0)
,流程退出循环。
最后 nr
的值(给定整数中设置的位数)返回给调用函数。
了解程序流程的最佳方式是通过调试器执行程序。我强烈建议你通过一个debugger.It执行一次程序将帮助你完全理解流程。
我不明白如何计算二进制表示中 1 的个数。
我有我的代码,希望有人能帮我解释一下。
代码:
int count (int x)
{
int nr=0;
while(x != 0)
{
nr+=x%2;
x/=2;
}
return nr;
}
为什么要
while
?例如,如果我有1011
,它不会停在 0?为什么
nr += x%2
?为什么
x/=2
?!
第一个:
nr += x % 2;
想象一下二进制的 x:
...1001101
模运算符 returns 来自 a / b 的余数。
现在 x 的最后一位要么是 0,在这种情况下 2 总是以 0 余数进入 x,要么是 1,在这种情况下它 return 是 1。
如您所见,x % 2 将 return(如果最后一位是 1)为 1,从而将 nr 递增 1,或者不递增,在这种情况下 nr 不变。
x /= 2;
这会将 x 除以二,并且因为它是整数,所以舍去余数。这意味着二进制文件是
....10
它将找出 2 进入其中的次数,在本例中为 1。它有效地删除了二进制数的最后一位,因为在基数 2(二进制)中,2 进入数字的次数是与 'shifting' 下的所有内容一样 space (这是一个糟糕的解释,请询问是否需要详细说明)。这有效地 'iterates' 通过了二进制数,允许行即将检查下一位。
这将迭代直到二进制只是 1
,然后减半,舍弃余数,x 将等于 0,
while (x != 0)
在这种情况下退出循环,你已经检查了每一点。
还有:
'count` 可能不是最能描述函数的名称,请考虑将其命名为更能描述其用途的名称。
nr 将始终是大于或等于零的整数,因此您可能应该具有 return 类型 unsigned int
int count (int x)
{
int nr=0;
while(x != 0)
{
nr+=x%2;
x/=2;
}
return nr;
}
这个程序基本上给出了给定整数中设置位的数量。
例如,让我们从示例整数 11(二进制表示 - 1011
)开始。
第一个流程将进入 while
循环并检查数字是否为零。
while(11 != 0)
因为 11
不等于零,所以它进入 while
循环并且 nr
被赋值为 1 (11%2 = 1)。nr += 11%2;
然后它执行循环内的第二行 (x = x/2)。这行代码将值 5 (11/2 = 5 )
赋值给 x
.
一旦完成 while
循环体,它就会再次检查 x
是否等于 5,即 5 是否等于 0。
while( 5 != 0)
。
由于情况并非如此,因此流程第二次进入 while
循环,并且 nr
被分配了值 2 ( 1+ 5%2)
。
之后 x
的值除以 2 (x/2, 5/2 = 2 ) 并将 2 赋值给 x
。
同样在下一个循环中,while (2 != 0 )
,nr
加上(2 + 2%2),因为2%2为0,所以nr
的值仍然是2,x
的值在下一行减少到 1 (2/2)。
1不等于0所以第三次进入while循环
在 while 循环的第三次执行中 nr
值增加到 3 (2 + 1%2)。
之后 x
的值减少到 0 ( x = 1/2 which is 0
).
由于未通过检查 (while x != 0)
,流程退出循环。
最后 nr
的值(给定整数中设置的位数)返回给调用函数。
了解程序流程的最佳方式是通过调试器执行程序。我强烈建议你通过一个debugger.It执行一次程序将帮助你完全理解流程。