Si tengo un puntero al inicio de una región de memoria, y necesito leer el valor empaquetado en los bits 30, 31 y 32 de esa región, ¿cómo puedo leer ese valor?Lectura de bits en una memoria
7
A
Respuesta
8
Uso bit masks.
3
Depende de qué tan grande es un byte en su máquina. La respuesta variará dependiendo de si tiene cero o una indexación para esos números. La siguiente función devuelve 0 si el bit es 0 y distinto de cero si es 1.
int getBit(char *buffer, int which)
{
int byte = which/CHAR_BIT;
int bit = which % CHAR_BIT;
return buffer[byte] & (1 << bit);
}
Si el compilador no puede optimizar lo suficientemente bien como para activar la división y operaciones mod en operaciones de bits, que podría hacerlo explícitamente, pero prefiero este código para mayor claridad.
(editado para corregir un error y cambiar a CHAR_BIT, que es una gran idea.)
0
En un sistema de 32 bits, puede simplemente desplazar el puntero a la derecha 29. Si necesita los valores de bit en su lugar, y en 0xE0000000.
1
probablemente me generalize this answer a algo como esto:
template <typename T>
bool get_bit(const T& pX, size_t pBit)
{
if (pBit > sizeof(pX) * CHAR_BIT)
throw std::invalid_argument("bit does not exist");
size_t byteOffset = pBit/CHAR_BIT;
size_t bitOffset = pBit % CHAR_BIT;
char byte = (&reinterpret_cast<const char&>(pX))[byteOffset];
unsigned mask = 1U << bitOffset;
return (byte & mask) == 1;
}
poco más fácil de usar:
int i = 12345;
bool abit = get_bit(i, 4);
Cuestiones relacionadas
- 1. Lectura en 16 bits de un registro de 32 bits
- 2. Lectura de datos de bits alineados
- 3. Lectura de 64 bits Registro desde una aplicación de 32 bits
- 4. Dibujando en un mapa de bits en escala de grises de 16 bits en la memoria
- 5. .NET 3.5SP1 Modelo de memoria de 64 bits en comparación con el modelo de memoria de 32 bits
- 6. Lectura de un inode en disco en la memoria
- 7. Error de memoria de mapa de bits en Android ...
- 8. Requisitos de memoria de una referencia de objeto en una JVM de 64 bits
- 9. Alineación de memoria en un procesador Intel de 32 bits
- 10. Lectura de memoria de otro proceso en OS X?
- 11. OpenCV - Lectura de una imagen en escala de grises de 16 bits
- 12. Memoria máxima para 64 bits Java
- 13. ¿Cómo se implementa la memoria de solo lectura en C?
- 14. Cómo se accede a un solo byte de la memoria mediante la CPU en una memoria de 32 bits y en el procesador de 32 bits
- 15. Lectura de clave pública/privada de la memoria con OpenSSL
- 16. Límite de memoria de proceso del proceso de 64 bits
- 17. lectura de la corriente de la memoria a la cadena
- 18. ¿Por qué la fragmentación de memoria es un problema en una máquina de 64 bits?
- 19. Error de memoria insuficiente al cargar un mapa de bits
- 20. Android - ¿Administración de mapa de bits y memoria?
- 21. ¿Aplicación de 32 bits o de 64 bits en el sistema operativo de 64 bits?
- 22. ¿Cuál es la memoria anterior a 0x08048000 utilizada en una máquina de 32 bits?
- 23. ¿Por qué __sync_add_and_fetch funciona para una variable de 64 bits en un sistema de 32 bits?
- 24. cocoa ¿Los binarios de 64 bits pierden memoria? (liberar NSData no libera la memoria)
- 25. Cómo genrate una máscara de bits en blanco y negro de un mapa de bits de 32 bits
- 26. ¿Cuánta memoria tiene una constante en C?
- 27. La lectura desde la transmisión PackagePart no libera la memoria
- 28. ¿Es esta una forma segura de compartir memoria de solo lectura con procesos secundarios?
- 29. ¿Puede un programa de 32 bits usar más de 4 GB de memoria en un sistema operativo de 64 bits?
- 30. ¿Puede un proceso de 32 bits acceder a más memoria en un sistema operativo Windows de 64 bits?
Use 'CHAR_BIT' en lugar de 8. – GManNickG
En caso de no ser esto:' búfer de retorno [byte] & (1 << bit); '? Se siente como si permitieras pasar demasiados bits si (por ejemplo) bit == 3. –
@platinum yup. Escribiendo muy rápido. Arreglando ahora. –