operaciones bit a bit en vector
-
27-09-2019 - |
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!
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>());