#define _GNU_SOURCE #include #include int flipbit(unsigned long num, int pos, int onoff); int tellbit(unsigned long num, int pos, int onoff); void usage(int argc, char ** argv); void printbits(unsigned long); int main(int argc, char ** argv) { char ch; int tellbits = 0; unsigned long num = 0; while ((ch = getopt(argc, argv, "tx:d:h?")) != EOF) switch (ch) { case 'x': sscanf(optarg,"%x", &num); break; case 'd': num = atol(optarg); break; case 't': tellbits = 1; break; case 'h': case '?': default: usage(argc, argv); break; } if(optind < argc && !num) num = atol(argv[optind]); while(1) { int instate; int pos; char buf[1024]; size_t buflen = sizeof(buf); size_t retlen = 0; pos = 0; printf("Decimal: %#0d Hex: %#0x \n", num, num); if(tellbits) printbits(num); printf("Bit position to turn off? "); if(!fgets(buf, buflen, stdin)) break; if(EOF == sscanf(buf,"%d", &pos)) instate = 0; else { instate = 1; num = flipbit(num, pos, 0); } printf("Bit position to turn on? "); if(!fgets(buf, buflen, stdin)) break; if(EOF == sscanf(buf,"%d", &pos)) instate = 0; else { instate = 1; num = flipbit(num, pos, 1); } printf("Value of bit position? "); if(!fgets(buf, buflen, stdin)) break; if(EOF == sscanf(buf,"%d", &pos)) { if(!instate) break; } else printf("Bit position %d is %s\n", pos, tellbit(num, pos, 1) ? "on" : "off"); } } int flipbit(unsigned long num, int pos, int onoff) { unsigned long tempnum = 1; /* if(pos < 0 || pos > 31) return num; */ tempnum <<= pos; if(onoff) { num |= tempnum; } else { num &= ~tempnum; } return num; } int tellbit(unsigned long num, int pos, int onoff) { unsigned long tempnum = 1; /* if(pos < 0 || pos > 31) return num; */ tempnum <<= pos; if(onoff) return(num & tempnum); else return(!(num & tempnum)); } void usage(int argc, char ** argv) { fprintf(stderr, "Usage: %s [-t] [-x 0xnumber] [-d number] [-h | -?]\n" " -t : tell all bit positions\n" " -x 0xNumber : Hex number\n" " -d number : Decimal number\n" " -h -? : This message\n" , "flipbit.exe" ); } void printbits(unsigned long num) { int i; int j = 0; i = sizeof(num) * 8 + 1; while(--i) j += printf("|%d",i); printf("|\n"); j++; while(--j) printf("-"); printf("\n"); i = sizeof(num) * 8 + 1; while(--i) { // printf("Bit position %d is %s\n", i, tellbit(num, i, 1) ? "on" : "off"); printf("|%d",tellbit(num,i,1) > 0 ); } printf("|\n"); }