Pregunta

¿cuál es la mejor manera de realizar operaciones bit a bit en vector<bool>?

Como lo entiendo, vector<bool> es una especialización que los usos un bit por booleano. Elegí vector<bool> por razones de ahorro de memoria. Yo sé que hay algunos problemas con vector<bool> pero para mis necesidades que de apropriate.

Ahora -? Cuál es la forma mas potente de aplying operaciones bit a bit a enteros tales vectores

Si lo hago en un bucle y lectura cada sola bool y almacenar de nuevo, la forma en que lo entienden mucho más las operaciones se realizan en el interior con el fin de acceder a los valores reales.

Gracias!

¿Fue útil?

Solución

Si el número de bits se fijan en tiempo de compilación, que sería mucho mejor usar std::bitset

Si no, (es decir número de bits varía en tiempo de ejecución), entonces debe ver y puede utilizar boost::dynamic_bitset )

En ambos de estos, es muy fácil de hacer todas las operaciones bit a bit.

Otros consejos

Ignorando el título de tu pregunta, la respuesta deja este pregunta, en su lugar:

  

¿cuál es la mejor manera de realizar operaciones bit a bit en vectores?

La mejor manera es definir su vector como vector<unsigned char> (o vector<uint32_t>, o cualquier otro tipo entero a elegir), y hacer sus operaciones bit a bit cómo lo haría normalmente para una matriz de enteros sin signo. Las cosas van a ser mucho más rápido de esta manera, y no habrá ningún mecanismo oculto.

Puede usar la división (o operadores de bits, Si tienes pocos recursos) para resolver el que el índice de matriz que necesita para operar en contra, y para los bucles de aplicar operaciones bit a bit más grandes que un solo elemento.

Aquí hay una pregunta relacionada: haciendo girar una gran cantidad de bits en C

Usted básicamente estar haciendo estas mismas operaciones, siempre y cuando se decida a envolver vector<unsigned some-int-type> con sus propios operadores.

He leído tanto estas respuestas, pero sólo quería una solución rápida, e implementó algo horrible.

Puede hacer que los operadores de bits trabajar en vector<bool>, pero el código tiene que ser especializado para el C ++ estándar de implementación de la biblioteca o caer de nuevo a la forma lenta. Aquí está mi operator| para GNU libstdc ++ - v3:

std::vector<bool> operator|(std::vector<bool> A, const std::vector<bool>& B)
{
    if (A.size() != B.size())
        throw std::invalid_argument("differently sized bitwise operands");

    std::vector<bool>::iterator itA = A.begin();
    std::vector<bool>::const_iterator itB = B.begin();

    // c++ implementation-specific
    while (itA < A.end())
        *(itA._M_p ++) |= *(itB._M_p ++); // word-at-a-time bitwise operation

    return A;
}

Esto es, por supuesto, bastante malo. Alguien actualiza GCC, las nuevas tiendas versión cosas de manera diferente, y se rompe el código sin razón aparente.

Éste debería funcionar también.

std::vector<bool> v3(v1.size());
std::transform(v1.begin(), v1.end(), 
               v2.begin(), v3.begin(), std::logical_and<bool>());
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top