Salva i flag in un int32 [chiuso]

-4

Unity3d PlayerPrefs consente solo il salvataggio di alcuni tipi: string, float e int32. Poiché int è composto da 32 bit, dovrebbe essere in grado di memorizzare 32 flag o un bool [] di lunghezza 32.

Finora, ho pensato di impostare l'int in base a un numero binario di 32 cifre, in cui ogni cifra rappresenta una bandiera. Sto avendo problemi a fare questo con considerazione dei numeri negativi.

C'è un modo per accedere a ogni singolo bit dell'int senza matematica ricorsiva da archiviare e usarli come flag?

    
posta JPtheK9 26.05.2015 - 04:26
fonte

3 risposte

3

Sì, c'è un attributo Flags che ti permette di usare enumerazioni come flag per un int, e il tipo ha metodi per aiutare a identificare se un flag è impostato e tale.

    
risposta data 26.05.2015 - 04:46
fonte
1

Espandendo su @ Telastyn's answer , puoi dichiarare i tuoi flag come enum con Flags attributo invece di utilizzare una matrice di booleani:

[Flags]
public enum Options : uint {
    Empty = 0,
    FancyClouds = 1,
    EnhancedGrassTextures = 2,
    HiDefNoses = 4,
    NoPantsMode = 8,
    // etc. values are increasing powers of 2 up to 2^31
}

Puoi armeggiare con i flag usando gli operatori bit a bit:

Options flags = Options.HiDefNoses | Options.FancyClouds;
flags &= ~Options.HiDefNoses;               // remove an option
if ((flags & Options.HiDefNoses) != 0) {    // test an option
if (flags.HasFlag(Options.HiDefNoses)) {    // same thing, nicer(?) syntax

E il valore enum può essere (esplicitamente) lanciato su e da Int32:

int i = (int)flags;
Options o = (Options)i;     // round-tripped to int and back
    
risposta data 26.05.2015 - 06:11
fonte
0

Ecco cosa mi è venuto in mente:

Il modo attributo Flags consisteva in diverse insidiose insidie. Ad esempio, i cambiamenti di bit sulle scritture firmate sono aritmetici, quindi il bit di segno non può essere facilmente utilizzato. Inoltre, ricostruire l'array di flag da una maschera di bit può diventare davvero un disastro, come menzionato da Blorgbeard.

Invece, ho usato la classe System.BitArray che è facilmente accessibile con gli indici. BitArray consente una facile serializzazione e deserializzazione da e verso un int. BitArray offre un metodo CopyTo () per copiare i suoi bit in un array di byte che può quindi essere convertito in un int con BitConverter.ToInt32 (). Per ricostruire il BitArray, è possibile utilizzare un costruttore che accetta un array di byte generato da BitConverter.GetBytes ().

cioè.

//Serializing 32 flags into int
BitArray bitArray = new BitArray (32);
byte[] byteBuffer = new byte[4];
bitArray.Copyto (byteBuffer, 0);
int SerializedFlags = BitConverter.ToInt32 (byteBuffer, 0);

//Reconstructing 32 flags from int
byteBuffer = BitConverter.GetBytes(SerializedFlags);
bitArray = new BitArray (byteBuffer);
    
risposta data 26.05.2015 - 10:26
fonte

Leggi altre domande sui tag