2016-10-09 41 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)