Привет всем, есть быстрый вопрос, который я не могу найти ничего о ...Большие флаги перечислений в C#
Я работаю над проектом, который требует перечислений флаг с большим количеством флагов (до 40-иш), и я не чувствую, набрав в точной маски для каждого значения перечисления:
public enum MyEnumeration : ulong
{
Flag1 = 1,
Flag2 = 2,
Flag3 = 4,
Flag4 = 8,
Flag5 = 16,
// ...
Flag16 = 65536,
Flag17 = 65536 * 2,
Flag18 = 65536 * 4,
Flag19 = 65536 * 8,
// ...
Flag32 = 65536 * 65536,
Flag33 = 65536 * 65536 * 2
// right about here I start to get really pissed off
}
Кроме того, я также надеюсь, что есть простой (МЭО) способ для меня для управления фактическим расположением бит на разных конечных машинах, поскольку эти значения в конечном итоге будут сериализованы по сети:
public enum MyEnumeration : uint
{
Flag1 = 1, // BIG: 0x00000001, LITTLE:0x01000000
Flag2 = 2, // BIG: 0x00000002, LITTLE:0x02000000
Flag3 = 4, // BIG: 0x00000004, LITTLE:0x03000000
// ...
Flag9 = 256, // BIG: 0x00000010, LITTLE:0x10000000
Flag10 = 512, // BIG: 0x00000011, LITTLE:0x11000000
Flag11 = 1024 // BIG: 0x00000012, LITTLE:0x12000000
}
Итак, я отчасти интересно, если есть какой-нибудь классный способ я могу установить мои перечисления вверх, как:
public enum MyEnumeration : uint
{
Flag1 = flag(1), // BOTH: 0x80000000
Flag2 = flag(2), // BOTH: 0x40000000
Flag3 = flag(3), // BOTH: 0x20000000
// ...
Flag9 = flag(9), // BOTH: 0x00800000
}
Что я пробовал:
// this won't work because Math.Pow returns double
// and because C# requires constants for enum values
public enum MyEnumeration : uint
{
Flag1 = Math.Pow(2, 0),
Flag2 = Math.Pow(2, 1)
}
// this won't work because C# requires constants for enum values
public enum MyEnumeration : uint
{
Flag1 = Masks.MyCustomerBitmaskGeneratingFunction(0)
}
// this is my best solution so far, but is definitely
// quite clunkie
public struct EnumWrapper<TEnum> where TEnum
{
private BitVector32 vector;
public bool this[TEnum index]
{
// returns whether the index-th bit is set in vector
}
// all sorts of overriding using TEnum as args
}
Просто интересно, есть ли у кого-нибудь интересные идеи, спасибо!
Вы набрали несколько сотен строк текста здесь. Почему вы просто не укусили пулю и не набрали оригинальные 40 строк? (Возможно, вы использовали 1 << 1, 1 << 2, ... вместо множителей, но в любом случае ...) –
Умм ... Я действительно хотел представить решения, которые я пробовал, «<<" and ">>» имел бы но я точно не вижу разницы, когда их оценивают только один раз. Это не похоже на то, что мне требуется полчаса, чтобы напечатать это, несколько сотен строк текста не так много ...Я бы предпочел предоставить слишком много информации, чем слишком мало ... – LorenVS
вы можете использовать весь диапазон ulong с оператором shift, вам просто нужно указать компилятору, что 1, который вы перемещаете, является ulong. 1ul << 63, обратите внимание на 'ul' afer the 1. –