Подтвердить что ты не робот

Как преобразовать int в битовую маску?

Есть ли способ преобразовать int в битовую маску?

Пример:

int i = 33;

должен быть преобразован в (не уверен в типе данных)

bool[] bitmask = new[] {true, false, false, false, false, true};

Обновление
Отвечая на большинство ответов:

Мне нужно сделать это:

BitArray bits = new BitArray(BitConverter.GetBytes(showGroup.Value));
List<String> showStrings = new List<string>();
for (int i = 0; i < bits.Length; i++)
{
    if(bits[i])
        showStrings.Add((i+1).ToString().PadLeft(2, '0'));
}

Как бы это произошло, не преобразовывая его в bitarray?

4b9b3361

Ответ 1

An int уже является битовой маской. Если вы хотите покрутить биты, вы можете использовать побитовые операторы свободно на ints. Если вы хотите преобразовать int в перечисление, имеющее атрибут Flags, достаточно простого приведения.

Ответ 2

Найдено

BitArray bits = new BitArray(System.BitConverter.GetBytes(showGroup.Value));

Ответ 3

Вы можете построить bool[32] и перебрать все биты в int, маскируя его с помощью 2 ^ (счетчик циклов) и соответствующим образом установить bool в массиве.

Вы уверены, что вам это нужно? Большинство операций с битмасками напрямую работают с ints.

Чтобы ответить на вопрос в вашем редактировании:

int val = 35;
List<string> showStrings = new List<string>();
for (int i = 0; i < 32; i++)
{
    if (( (1 << i) & val) > 0)
    {
        showStrings.Add((i + 1).ToString().PadLeft(2, '0'));
    }
}

Отпечатки:

01  
02  
06 

Не самое очевидное решение, если вы не привыкли бить арифметику, правда. Маска каждого бита в целочисленном значении с 2 ^ (бит-индекс), и если результирующее значение больше нуля (указывает, что бит в этом индексе установлен), сделайте что-нибудь. 1 << i (сдвиг слева) эквивалентен 2^i и может иметь одни и те же характеристики производительности после JIT, но я привык к этой форме.

Выражается как макроподобный метод:

bool IsSet(int val, int index)
{
    return (( (1 << (index-1)) & val) > 0);
}

Ответ 4

int val = 33;
var bitarray = new BitArray(new[] { val });
var att = bitarray.Cast<bool>().ToArray();

Ответ 5

Поскольку вы спросили, вот решение без использования BitArray:

// First define a bitmask enum for the bits you are interested in
[Flags]
public enum BitFlags
{
  Flag1 = 1,
  Flag2 = 2,
  Flag3 = 4,
  Flag4 = 8,
  Flag5 = 16
  // ...
}

int index = 0;
List<string> showStrings = new List<string>();
foreach(int flag in Enum.GetValues(typeof(BitFlags))cast<int>())
{
  index += 1;
  if ((input & flag) == flag)
    showStrings.Add(index.ToString().PadLeft(2, '0'));
}

Это примерно такое же количество кода с незначительной разницей в производительности. Тем не менее, он позволяет строго определить ваши значения бит, и вы можете отказаться от битов в перечислении BitFlags, которые вам не нужны.