Domanda

Ho letto tutto il luogo la gente parla di comprimere gli oggetti su un po 'dalla scala bit. Cose come "I primi tre bit rappresentano così e così, poi il prossimo due rappresentano questo e dodici bit per questo"

Capisco il motivo per cui sarebbe auspicabile per ridurre al minimo l'utilizzo della memoria, ma non riesco a pensare ad un buon modo per implementare questo. So che sarebbe in valigia in uno o più numeri interi (o long, qualunque sia), ma non riesco a immaginare un modo semplice per lavorare con esso. Sarebbe piuttosto fresco se ci fosse una classe dove ho potuto ottenere / impostare i bit arbitrari da una lunghezza campo binario arbitraria, e sarebbe prendersi cura delle cose per me, e io non avrebbe dovuto andare pasticciare in giro con il & 's e |' s e le maschere e così via.

C'è un modello standard per questo genere di cose?

È stato utile?

Soluzione

MSDN :

  

BitArray Classe

     

Gestisce una matrice compatta di valori di bit, che sono rappresentati come booleani, dove true indica che il bit è attivo (1) e false indica il bit è spento (0).

Esempio:

BitArray myBitArray = new BitArray(5);
myBitArray[3] = true; // set bit at offset 3 to 1

BitArray consente di impostare solo i singoli bit, però. Se si desidera codificare i valori con più bit, probabilmente non c'è modo per aggirare pasticciare in giro con il & 's e |' s e le maschere e cose: -)

Altri suggerimenti

Si potrebbe voler controllare la BitVector32 struttura in .NET Framework. Consente di definire "sezioni", che sono campi di bit all'interno di un int, quindi leggere e scrivere i valori di quelle sezioni.

Il principale limite è che è limitata a un singolo intero a 32 bit; Questo può o non può essere un problema a seconda di quello che stai cercando di fare. Come accennato DTB, BitArray in grado di gestire i campi di bit di qualsiasi dimensione, ma si può solo ottenere e impostare un singolo bit alla volta -. Non c'è il supporto per le sezioni come in BitVector32

Quello che stai cercando sono chiamati bit per bit operazioni.

Per esempio, supponiamo che andremo a rappresentare un valore RGB in meno significativi 24 bit di un intero, con R essendo bit 23-16, G essendo bit 15-8 e B essendo bit 7-0.

È possibile impostare R qualsiasi valore compreso tra 0 e 255 senza influenzare gli altri bit in questo modo:

void setR(ref int RGBValue, int newR)
{
  int newRValue = newR << 16; // shift it left 16 bits so that the 8 low-bits are now in position 23-16
  RGBValue = RGBValue & 0x00FF; // AND it with 0x00FF so that the top 16 bits are set to zero
  RGBValue = RGBValue | newRValue;   // now OR it with the newR value so that the new value is set.
}

Utilizzando AND bit a bit e OR (e di tanto in tanto le operazioni più esotici) si può facilmente impostare e cancellare qualsiasi singolo bit di un valore maggiore.

Invece di utilizzare le classi wrapper specifici penso si sta meglio mordere la pallottola e imparare i vostri & s e toolkit o piattaforma | s e 0x04s e come tutti i bit a bit operatori di lavoro. In linea di massima è così che il suo fatto per la maggior parte dei progetti, e le operazioni sono estremamente veloci. Le operazioni sono praticamente identici nella maggior parte delle lingue in modo da non essere bloccato dipendente da qualche toolkit specifico.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top