Pregunta

He leído todo el lugar la gente habla de la compresión de los objetos en una escala poco a poco. Cosas como "Los primeros tres bits representan tal y tal, entonces el siguiente dos representan esto y doce bits para que"

entiendo por qué sería deseable minimizar el uso de memoria, pero no puedo pensar en una buena forma de implementar esto. Sé que sería empacar en una o más números enteros (o largos, lo que sea), pero no puedo imaginar una manera fácil de trabajar con él. Sería muy bueno si había una clase donde pude obtener / poner trozos arbitrarios de un campo binario de longitud arbitraria, y que se haría cargo de las cosas para mí, y yo no tendría que ir curioseaba con & 's y |' s y máscaras y tal.

¿Hay un patrón estándar para este tipo de cosas?

¿Fue útil?

Solución

MSDN :

  

BitArray Class

     

gestiona un conjunto compacto de valores de bit, que se representan como Booleanos, donde la verdadera indica que el bit está en (1) y falso indica el bit es off (0).

Ejemplo:

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

BitArray le permite configurar sólo los bits individuales, sin embargo. Si desea codificar los valores con más bits, probablemente no hay manera alrededor de curioseaba con & 's y |' s y máscaras y otras cosas: -)

Otros consejos

Es posible que desee revisar la BitVector32 estructura en el .NET Framework. Permite definir "secciones", que son los rangos de bits dentro de un int, a continuación, leer y escribir valores en esas secciones.

La principal limitación es que es limitada a un solo número entero de 32 bits; esto puede o no puede ser un problema dependiendo de lo que estamos tratando de hacer. Como DTB mencionado, BitArray puede manejar campos de bits de cualquier tamaño, pero sólo se puede obtener y establecer un solo bit a la vez -. No hay soporte para las secciones como en BitVector32

Lo que estamos buscando son llamados bit a bit operaciones.

Por ejemplo, digamos que vamos a representar un valor RGB en los 24 bits menos significativos de un número entero, siendo R bits 23-16, siendo G bits de 15-8, y siendo B bits de 7-0.

Puede establecer R a cualquier valor entre 0 y 255 sin afectar los otros bits como esto:

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.
}

Mediante el uso de AND bit a bit y OR (y ocasionalmente operaciones más exóticas) puede fácilmente configurar y borrar cualquier bit individual de un valor mayor.

En lugar de utilizar conjunto de herramientas o plataforma clases específicas de cada envoltura que creo que es mejor morder la bala y el aprendizaje de sus s & y | s y 0x04s y cómo todos los operadores bit a bit de trabajo. Por lo general eso es como se hace para la mayoría de los proyectos y las operaciones son extremadamente rápido. Las operaciones son más o menos idénticos en la mayoría de idiomas por lo que no será atrapado depende de algún conjunto de herramientas específicas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top