вычисление количества последовательных единиц в двоичном числе с использованием c#

#c# #binary

#c# #двоичный

Вопрос:

Я хочу, чтобы программа перебирала все возможные двоичные числа от 00000000 до 11111111, и я должен вычислить количество последовательных «запусков» единиц. Пример) 00000001 и 11100000 оба считаются одиночными наборами единиц 00001010 и 11101110 оба считаются двумя наборами единиц

Проблема в том, что он игнорирует часть маски И, и я не знаю почему.

 {
    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 amp; 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;
    }
}
  

Ответ №1:

Проблема в том, что ваш код игнорирует прогоны, которые включают младший значащий бит. Ваш код обновляется uniRunTotal только тогда, когда он обнаруживает нулевой бит. Когда младший значащий бит отличен от нуля, uniRunCount он никогда не добавляется к сумме.

Добавьте код после цикла для добавления uniRunCount , чтобы устранить эту проблему.

Вы также можете исправить эту проблему, применив стратегию дозорного: считайте биты с другого конца и используйте девять бит вместо восьми, потому что бит номер девять всегда равен нулю:

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