C/C++
Manejo de bits fuera de gcc
8 de Enero del 2009 por Llyn · Deja un comentario
Bien, las siguientes funciones que trabajan con bits pertenecen solo al compilador gcc:
- __builtin_ctz
- __builtin_clz
- __builtin_popcount
Por lo tanto, si se requiere el uso en otros compiladores puede no encontrarse soporte, en mi caso, por ejemplo, que uso Visual C++, de tal modo que realice la implementación de tales funciones en C++, adjunto le añado una pequeña descripción para aquel que no los conozca:
int __builtin_ctz(int n);
Retorna la cantidad de Trailing Zeros, corresponde a los ceros por la derecha de n en binario, es decir, si tenemos que n es de tipo byte y de valor 52, que en binario es 00110100, la función retorna 2. Si n = 0, el resultado es indefinido.
template <class T>
int __builtin_ctz(T n) {
if (n == 0) throw "__builtin_ctz es indefinido para 0.";
int m = 0;
while (true) {
if (n & 1) break;
n >>= 1;
++m;
}
return m;
}
int __builtin_clz(int n);
Retorna la cantidad de Leading Zeros, similar a la función anterior pero esta vez devuelve la cantidad de ceros por la izquierda de n en binario, es decir, si tenemos que n es de tipo byte y de valor 11, que en binario es 00001011, la función retorna 4. Al igual que el caso anterior, si n = 0, el resultado es indefinido.
template <class T>
int __builtin_clz(T n) {
if (n == 0) throw "__builtin_clz es indefinido para 0.";
int m = 0;
T L = T(1) << (sizeof(T) * 8 - 1);
while (true) {
if (n & L) break;
n <<= 1;
++m;
}
return m;
}
int __builtin_popcount(int n);
Retorna la cantidad de bits activos, o sea, cuantos bits son 1, si usamos el ejemplo anterior tenemos que 11 = 00001011, entonces retornaría 3.
template <class T>
int __builtin_popcount(T n) {
int m = 0;
while (n) {
if (n & 1) ++m;
n >>= 1;
}
return m;
}
En cada función utilizo plantillas de tal modo de que funcione con int, long long, char, … sin necesidad de usar otra función, no obstante, en gcc utilizan como parámetro el tipo int.
Llyn reinventando la rueda…
- Posts Relacionados
- C#: Manejo de archivos de texto (I) Buenas Veamos un poco como manejar los ficheros en la...
- DFS DFS, acrónimo para Depth-First Search, en español Búsqueda en Profundidad,...








