#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)