miércoles, 1 de febrero de 2012

Funciones para manipular bits


La plantilla de nuevas funciones en Harbour es muy extensa, pero al no tener una buena documentación es dificil saber como se llaman las que estamos necesitando y a veces incluso terminamos duplicándolas sin saber que ya están escritas y con un código de gran calidad.
Rebuscando entre el código fuente de Harbour y sus ejemplos encontré las funciones de manipulación de bits que buscaba, y ya puestos os dejo una breve descripción de las mismas que espero les resulte útil.

HB_BITAND( nParam1, nParam2, … ) → nResult
Retorna un entero, el 'AND' lógico entre uno o más números enteros.

? HB_BITAND( 1, 3, 5 ) // 1

HB_BITOR( nParam1, nParam2, … ) → nResult
Retorna un número entero, el 'OR' lógico entre uno o más números enteros.

? HB_BITOR( 1, 3, 5 ) // 7

HB_BITXOR( nParam1, nParam2, … ) → nResult
Retorna un número entero, el 'XOR' lógico (OR exclusivo) entre uno o más números enteros.

? HB_BITXOR( 1, 3, 5 ) // 7

Como punto a destacar en estas tres funciones, y a diferencia de otras implementaciones que había visto anteriormente, se pueden especificar más de 2 parámetros.

HB_BITNOT( nParam ) → nResult
Retorna el entero negado del argumento.

? HB_BITNOT( 5 ) // -6

HB_BITTEST( nParam, nBit )  → lResult
Devuelve el valor lógico que indica si en bit nBit está en 1. Los bits están enumerados del 0 a 31, siendo el 0 el bit menos significativo.

? HB_BITTEST( 5, 0 ) // .T.
? HB_BITTEST( 5, 1 ) // .F.
? HB_BITTEST( 5, 2 ) // .T.

HB_BITSET( nParam1, nBit ) → nResult
Retorna el entero resultante de activar el bit nBit en el entero nParam1.

? HB_BITSET( 3, 2 ) // 7

HB_BITRESET( nParam1, nBit ) → nResult
Retorna el entero resultante de desactivar el bit nBit en el entero nParam1.

? HB_BITRESET( 3, 0 ) // 2

HB_BITSHIFT(  nParam1, nBit ) → nResult
Devuelve el entero nParam1 desplazado nBits, cuyo valor es positivo para desplazamientos a la izquierda y negativo a la derecha.

? HB_BITSHIFT( 3, 2 ) // 12
? HB_BITSHIFT( 9, -1 ) // 4

En todos los casos los parámetros se validan, y generan un error irrecuperable si el tipo es diferente de N.

Hasta la próxima...