Cześć wszystkim, mam szybkie pytanie, że nie mogę znaleźć nic na temat ...Duże flagi wyliczenia w C#
pracuję nad projektem, który wymaga wyliczeń flaga z dużą liczbą flag (do 40-owski), a ja naprawdę nie czuję się jak pisać w dokładnym maski dla każdej wartości liczby:
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
}
Ponadto, mam też nadzieję, że nie jest to łatwe (ier) sposób dla mnie do kontrolowania aktualnego rozmieszczenia bitów na różnych maszynach endian, ponieważ te wartości będą ostatecznie serializowane przez sieć:
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
}
Więc ja niby zastanawiać, czy istnieje jakiś fajny sposób mogę ustawić moich wyliczeń w górę jak:
public enum MyEnumeration : uint
{
Flag1 = flag(1), // BOTH: 0x80000000
Flag2 = flag(2), // BOTH: 0x40000000
Flag3 = flag(3), // BOTH: 0x20000000
// ...
Flag9 = flag(9), // BOTH: 0x00800000
}
Co Próbowałem:
// 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
}
Wystarczy zastanawiasz się, czy ktoś ma jakieś fajne pomysły, dzięki!
wpisałeś kilkaset wierszy tekstu tutaj. Dlaczego po prostu nie ugryzłeś kuli i nie wpisałeś oryginalnych 40 linii? (Mógłbyś użyć 1 << 1, 1 << 2, ... zamiast mnożenia, ale tak czy inaczej ...) –
Umm ... Chciałem przedstawić rozwiązania, które próbowałem, "<<" and ">>" pracował, ale nie widzę różnicy, gdy są one oceniane tylko raz. To nie tak, że zajmuje mi to pół godziny, a kilkaset linii tekstu to niewiele ...Wolałbym podać zbyt dużo informacji niż za mało ... – LorenVS
możesz użyć pełnego zakresu ulong z operatorem zmiany, po prostu musisz wskazać kompilatorowi, że 1, którego przesuwasz, jest ulong. 1ul << 63, zwróć uwagę na "ul" po 1. –