Kernel Error
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…

Compartelo:
  • Digg
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • BarraPunto
  • Meneame
  • MySpace
    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,...

Comenta algo

Comparte tu opinión...
Ah si... también si quieres mostrar una imagen tuya puedes usar gravatar!





BBCode Sencillo soportado.  

    Edición Avanzada desactivada.

Kernel Error
97 intentos de ataques detenidos