2016-10-09 40 views
0

我希望程序遍历每个可能的00000000至11111111的二进制数,并计算连续的“运行”数。 例)00000001和11100000两个计数为那些 00001010和11101110的单次运行两个计数为那些使用c#计算二进制数的连续数#

的问题是两分,是它忽略和屏蔽的一部分,我不知道为什么。

{ 
    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

问题是您的代码忽略包含最低有效位的运行。只有在发现零位时,您的代码才会更新uniRunTotal。当最低有效位不为零时,uniRunCount永远不会被添加到总数中。

在循环后添加代码以添加uniRunCount来解决此问题。

您也可以通过应用定点战略解决这个问题:从另一端数位,并用九个位的不是8,因为位九数始终为零:

for (int uniMask = 1; uniMask <= 256; uniMask <<= 1)