2016-12-11 2 views
4

Я храню все мои снаряженные пушки, используя бит-флаг, и просто задавался вопросом, можно ли проверить, сколько чисел содержится в битовом флаге.Как проверить, сколько цифр бит/бит-маска содержит

например. :

13 будет содержать 1, 4 и 8

ПРИМЕЧАНИЕ: Я новичок в битовые флаги, так что мой вопрос может не делать слишком много смысла, или я мог бы использовать неправильную терминологию, если это так просто дайте мне знаю, и я буду рад изменить его.

+0

Почему 13 содержит 1, 4 и 8? – rene

+0

1 + 4 + 8 = 13 ..... – Peyton

+0

10 + 3 = 13 Почему это не так? – rene

ответ

2

Поскольку вы спрашиваете:

Сколько чисел содержатся в бит-флаг?

Это должно работать:

int CountBits(int n) 
{ 
    int count = 0; 
    do 
    { 
     int has = n & 1; 
     if (has == 1) 
     { 
      count ++ ; 
     } 

    } while((n >>= 1) != 0); 

    return count; 
} 
+0

Обратите внимание, что это никогда не закончится, если изначально установлен бит бит, т. Е. 'N' является отрицательным. –

+0

@IvanStoev Абсолютно верно. Однако, поскольку OP-хождение оборудовано оружием, использующим бит-флаг, входное значение должно быть отрицательным, если только он не использует signbit. –

+0

@ IvanStoev фактически меняет условие на '(n >> = 1)! = 0', должно устранить проблему. –

0

Я быстро написал метод, который делает именно то, что вы хотите, конечно, не лучший, хотя:

public static List<int> DecomposeBitFlag(int flag) { 
    var bitStr = Convert.ToString(flag, 2); 
    var returnValue = new List<int>(); 
    for(var i = 0 ; i < bitStr.Length ; i++) { 
     if (bitStr[bitStr.Length - i - 1] == '1') { 
      returnValue.Add((int)Math.Pow(2, i)); 
     } 
    } 
    return returnValue; 
} 

Как это работает:

Я сначала преобразовать целочисленный параметр в двоичную строку. Для каждого из «1» s в строке добавьте 2 к мощности i в список возвращаемых значений. i - индекс «1» в инвертированной строке.

EDIT:

Если вы хотите знать, число битов, это будет делать:

public static int BitFlagBitCount(int flag) { 
    var bitStr = Convert.ToString(flag, 2); 
    return bitStr.Count(c => c == '1'); 
} 
+0

ОК спасибо ... Я попробую это – Peyton

+0

, чтобы этот метод вернул список правильно? – Peyton

+0

@Peyton Да. Он возвращает список, содержащий все биты, составляющие флаг. – Sweeper

Смежные вопросы