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 ) // 1HB_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 ) // 7HB_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 ) // 7HB_BITRESET( nParam1, nBit ) → nResult
Retorna el entero resultante de desactivar el bit nBit en el entero nParam1.
? HB_BITRESET( 3, 0 ) // 2HB_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 ) // 4En todos los casos los parámetros se validan, y generan un error irrecuperable si el tipo es diferente de N.
Hasta la próxima...