Ciao a tutti, ha ottenuto una domanda veloce che io non riesco a trovare nulla ...grandi bandiere enumerazioni in C#
Sto lavorando su un progetto che richiede enumerazioni bandiera con un gran numero di bandiere (fino al 40-ish), e non mi sento davvero come digitando nella maschera esatta per ciascun valore di enumerazione:
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
}
inoltre, sto anche sperando che non v'è un facile (ier) modo per me per controllare l'effettiva disposizione dei bit su diverse macchine endian, dal momento che questi valori saranno eventualmente serializzati su una rete:
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
}
Quindi, sto tipo di chiedevo se c'è un modo fresco posso impostare il mio enumerazioni in su come:
public enum MyEnumeration : uint
{
Flag1 = flag(1), // BOTH: 0x80000000
Flag2 = flag(2), // BOTH: 0x40000000
Flag3 = flag(3), // BOTH: 0x20000000
// ...
Flag9 = flag(9), // BOTH: 0x00800000
}
che cosa ho provato:
// 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
}
Proprio chiedendo se qualcuno ha qualche idea interessante, grazie!
avete digitato poche centinaia di righe di testo qui. Perché non hai appena morso il proiettile e hai digitato le 40 linee originali? (Potresti aver usato 1 << 1, 1 << 2, ... invece dei multipli, ma comunque ...) –
Umm ... Volevo presentare le soluzioni che avevo provato, "<<" and ">>" avrebbe ha funzionato, ma non vedo esattamente la differenza quando vengono valutati solo una volta. Non è che mi ci voglia mezz'ora per scrivere questo, poche centinaia di righe di testo non sono molte ...Preferirei fornire troppe informazioni che troppo poco ... – LorenVS
puoi usare l'intera gamma di ulong con l'operatore del cambio, dovrai solo indicare al compilatore che il 1 che stai spostando è un ulong. 1ul << 63, notate che l''ul' più basso è il 1. –