Para verdaderos maestros de C

Harold
01 de Abril del 2010
Buen día maestros

Tengo un inconveniente muy puntual, necesito saber cuales bits están encendidos o apagados en un byte,

ej:

En un byte tengo el valor de 0xBC que en binario es 10111100, entonces necesito saber como hago para ver cuales de esos bits están en 1 o en 0;, usando lenguaje ansi C

Por favor responde si sabes realmente como hacerlo y que te haya funcionado
Gracias ;-)

maironburn
01 de Abril del 2010
Salu2 Harold, yo poco o nada tengo que ver con un maestro, al menos no en programación...
La solución que se me ocurre en primera instancia es realizar la conversión del número decimal(o hexa) a binario y guardarlo en un array , para después recorrerlo y contar los 1.
Algo así:

/*TAM es una constante de valor 17, 16 posiciones para valores y la última para el caracter fin de cadena ''

#define TAM 17

*/

int flags (int n)
{

int i;
char cadenabits[TAM];
int flags_on=0;

for(i=0;i<TAM-1;i++) cadenabits[i]='0';
cadenabits[i]='';


for(i=TAM-2;i>0;i--)
{
if( (n/2)>= 0)
{
if (n%2==0)
{
cadenabits[i]='0';
}
else cadenabits[i]='1';
n=n/2;
}
else cadenabits[i]='0';


}
cadenabits[TAM-1]='';

for (i=0;cadenabits[i]!='';i++)
if ( cadenabits[i]=='1') flags_on++;

return flags_on;
}


Supongo que habrá soluciones más óptimas, pero es lo primero que se me ha ocurrido
Espero que te sirva.

Salu2

maironburn
01 de Abril del 2010
ahora que ya estoy despierto...bueno, la conversión a cadena tendría utilidad si necesitaras conocer el valor de un bit concreto, pero si sólo necesitas saber el numero de bits a 1:

int flags (int n)
{

int i;
int flags_on=0;

for(i=n;i>0;i=i/2)
{

if (i%2!=0)
{
flags_on++;
}
}

return flags_on;
}