我需要循环一个整数的位表示,然后我需要计算它中的零个数.我厌倦了下面的代码,但不幸的是它没有用:
public int calculate(int i)
{
string a = Convert.ToString(i, 2);
int[] array = new int[a.Length];
int number = 0;
for (int n = 0; n < s.Length; n++)
{
iarray[n] = s[n]; // build an array of intigers representing the bits valies such as 0011100
}
for (int n = 0; n < array.Length; n++)
{
if (array[n] == 0) {
number = number + 1;
}
return number
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以建议为什么它没有按预期工作?
它不起作用的原因是你在比较字符('0',值48!= 0)
只需使用位运算符,使用无符号数学运算来避免右移负数的复杂化:
要计算全零:
var u = (uint)i;
int count = 0;
for(int bit = 0; bit < 32; bit++)
{
if((u & 1)==0) count++;
u = u >> 1;
}
Run Code Online (Sandbox Code Playgroud)
要将零计数到最重要的设置位:
var u = (uint)i;
int count = 0;
while(u != 0)
{
if((u & 1)==0) count++;
u = u >> 1;
}
Run Code Online (Sandbox Code Playgroud)
如果您需要优化,还有更多奇特的方法.