es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Imprimir el conjunto de bits rápidamente en c++

Estoy escribiendo un programa que muestra números binarios, y tengo muchos de ellos que quiero mostrar en la terminal, pero esto lleva mucho tiempo.
En otras partes de mi programa donde quiero mostrar rápidamente cadenas de texto uso

_putchar_nolock

y para números decimales y de punto flotante uso

printf

Actualmente, mi código se ve así para mostrar números binarios:

for (size_t i = 0; i < arraysize; i++)
{
std::cout << (std::bitset<8>(binarynumbers[i]));
}

la salida devuelve unos 0s y 1s bonitos, que es lo que quiero, sin hexadecimal. El problema es que cuando ejecuté pruebas y comparaciones de rendimiento, encontré que std::cout era significativamente más lento que putcharnolock y printf.

Buscando en línea, no encontré una forma de usar printf en un bitset y lograr que muestre unos 0s y 1s. Y putcharnolock parecería ser igual de lento al tener que hacer todas las conversiones de datos.

¿Alguien sabe una manera rápida y eficiente de mostrar un bitset en c++?
Mi programa es de un solo hilo y simple, así que no tengo problema con incluir código no seguro en términos de rendimiento, el rendimiento es un problema importante en el código en este momento.

Gracias por cualquier ayuda.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Si estás buscando una forma rápida y eficiente de mostrar un conjunto de bits en C++, podrías intentar usar técnicas de manipulación de bits a nivel bajo. Aquí tienes un ejemplo:

    void print_bitset(const std::bitset<8>& bits)
    {
        for (int i = 7; i >= 0; i--)
        {
            putchar('0' + ((bits >> i) & 1));
        }
    }
    

    Esta función toma un std::bitset<8> como entrada e itera sobre sus bits individuales de izquierda a derecha. Para cada bit, utiliza un desplazamiento a la derecha a nivel de bits combinado con una operación AND a nivel de bits para extraer su valor (0 o 1) y convertirlo en un carácter ‘0’ o ‘1’ utilizando aritmética entera. El carácter resultante se escribe en la salida estándar utilizando la función putchar, que es una función de salida de nivel bajo similar a _putchar_nolock.

    Para usar esta función en tu código existente, simplemente reemplazarías la línea std::cout << std::bitset<8>(binarynumbers[i]) por print_bitset(binarynumbers[i]).

    Ten en cuenta que este enfoque puede no ser tan portátil o fácil de leer/modificar como usar std::bitset y std::cout, pero debería ser significativamente más rápido. Además, dado que esta función solo funciona con conjuntos de bits de 8 bits (lo cual parece ser el caso según tu código existente), es posible que necesites modificarla ligeramente si necesitas soportar conjuntos de bits más grandes.

Comments are closed.