#include #include #include #include bool get8bit(FILE * f, uint8_t * b); void show8bit(uint8_t b); void demo_operations(uint8_t b, uint8_t mask); /* masks */ #define FOO (1) #define BAR (1 << 5) /* main program */ int main(void) { puts("enter 8-bit value (0s and 1s)"); uint8_t b; if (!get8bit(stdin, &b)) { puts("invalid input"); return 1; } demo_operations(b, FOO); demo_operations(b, BAR); demo_operations(b, FOO | BAR); return 0; } /* * get 8 chars (0 or 1) and convert to uint8_t * returns true if input is valid, false otherwise */ bool get8bit(FILE * f, uint8_t * b) { char bitchars[8]; char next; if ((scanf("%8s%c", bitchars, &next) != 2) || !isspace(next)) { return false; } uint8_t work = 0; for (int i = 0; i < 8; ++i) { if (bitchars[i] == '0') { work <<= 1; } else if (bitchars[i] == '1') { work <<= 1; work+=1; } else return false; } *b = work; return true; } /* show 8 bits */ void show8bit(uint8_t b) { for (uint8_t mask = 1 << 7; mask > 0; mask >>= 1) { if (mask & b) putchar('1') ; else putchar('0'); } } /* demo various operations -- setting, clearing, and testing bits */ void demo_operations(uint8_t b, uint8_t mask) { puts("value entered:"); show8bit(b); putchar('\n'); puts("mask:"); show8bit(mask); putchar('\n'); puts("result of setting all specified bits:"); show8bit(b | mask); putchar('\n'); puts("result of clearing all specified bits:"); show8bit(b & ~mask); putchar('\n'); printf("any bits set? %c\n", ((b & mask) == 0) ? 'n' : 'y'); printf("all bits set? %c\n", ((b | mask) == b) ? 'y' : 'n'); putchar('\n'); }