Un enfoque va a controlar dentro de la siguiente condición:
if ((mask >> bit) & 1)
Un programa de explicación será:
#include <stdio.h>
unsigned int bitCheck(unsigned int mask, int pin);
int main(void){
unsigned int mask = 6; // 6 = 0110
int pin0 = 0;
int pin1 = 1;
int pin2 = 2;
int pin3 = 3;
unsigned int bit0= bitCheck(mask, pin0);
unsigned int bit1= bitCheck(mask, pin1);
unsigned int bit2= bitCheck(mask, pin2);
unsigned int bit3= bitCheck(mask, pin3);
printf("Mask = %d ==>> 0110\n", mask);
if (bit0 == 1){
printf("Pin %d is Set\n", pin0);
}else{
printf("Pin %d is not Set\n", pin0);
}
if (bit1 == 1){
printf("Pin %d is Set\n", pin1);
}else{
printf("Pin %d is not Set\n", pin1);
}
if (bit2 == 1){
printf("Pin %d is Set\n", pin2);
}else{
printf("Pin %d is not Set\n", pin2);
}
if (bit3 == 1){
printf("Pin %d is Set\n", pin3);
}else{
printf("Pin %d is not Set\n", pin3);
}
}
unsigned int bitCheck(unsigned int mask, int bit){
if ((mask >> bit) & 1){
return 1;
}else{
return 0;
}
}
Salida:
Mask = 6 ==>> 0110
Pin 0 is not Set
Pin 1 is Set
Pin 2 is Set
Pin 3 is not Set
En caso de que necesite un valor de verdad simple, debe ser !! ((var) & (1 << (pos))). –
@Eduard: en C, todo '! = 0' es verdadero, entonces ¿para qué molestarse? '1' es exactamente tan verdadero como' 0.1415'! – Christoph
Y en caso de que esté usando C++, podría (debería) escribir una plantilla en lugar de una macro. :) – jalf