Ответ 1
An int
уже является битовой маской. Если вы хотите покрутить биты, вы можете использовать побитовые операторы свободно на ints. Если вы хотите преобразовать int
в перечисление, имеющее атрибут Flags
, достаточно простого приведения.
Есть ли способ преобразовать 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?
An int
уже является битовой маской. Если вы хотите покрутить биты, вы можете использовать побитовые операторы свободно на ints. Если вы хотите преобразовать int
в перечисление, имеющее атрибут Flags
, достаточно простого приведения.
Найдено
BitArray bits = new BitArray(System.BitConverter.GetBytes(showGroup.Value));
Вы можете построить 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);
}
int val = 33;
var bitarray = new BitArray(new[] { val });
var att = bitarray.Cast<bool>().ToArray();
Поскольку вы спросили, вот решение без использования 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, которые вам не нужны.