我想让程序遍历从00000000到11111111的每个可能的二进制数,并且我要计算连续"运行的数量"一些。 例)00000001和11100000都算作单次运行 00001010和11101110都算作两次运行
问题是,它是否忽略了AND掩码部分,我不知道为什么。
{
static void Main(string[] args)
{
//Start
int stuff = BitRunner8();
//Display
Console.Write(stuff);
Console.ReadKey();
}
public static int BitRunner8()
{
int uniRunOrNot = 0;
int uniRunCount = 0;
int uniRunTotal = 0;
//iterating from numbers 0 to 255
for (int x = 0; x < 255; x++)
{
//I use 128 as my AND mask because 128 is 10000000 in binary
for ( int uniMask = 128; uniMask != 0; uniMask >>= 1)
{
//This is the if statement that doesn't return true ever
if ((x & uniMask) != 0)
{
//If the and mask is true, and ther were no previous ones before it, add to the the uniRunCount
if (uniRunOrNot == 0)
{
//Total count of the runs
uniRunCount++;
}
// Making it so that if two consective ones are in a row, the 'if' statement right above would return false,
//so that it wouldn't add to the uniRunCount
uniRunOrNot++;
}
else
{
//add the total number of runs to uniRunTotal, and then reset both uniRunOrNot, and uniRunCount
uniRunTotal += uniRunCount;
uniRunOrNot = uniRunCount = 0;
}
}
}
//Divide the final amount by 256 total numbers
uniRunTotal /= 256;
return uniRunCount;
}
}
答案 0 :(得分:0)
问题是您的代码忽略了包含最低有效位的运行。只有在发现零位时,您的代码才会更新uniRunTotal
。当最低有效位为非零时,uniRunCount
永远不会添加到总数中。
在循环后添加代码以添加uniRunCount
来解决此问题。
您还可以通过应用 sentinel 策略解决此问题:从另一端计数位,并使用9位而不是8位,因为第9位始终为零:
for (int uniMask = 1; uniMask <= 256; uniMask <<= 1)