home *** CD-ROM | disk | FTP | other *** search
- /*
- PROGRAM : bit.c
- AUTHOR : John Gray
- DATE : January 1988
- FUNCTION : Demonstrates the use of 'bit strings' in C.
-
- */
-
- #include <stdio.h>
-
- #define HEX1 ((unsigned) (0x1)) /* hexadecimal 1 */
- #define BITSperBYTE (8) /* # of bits per byte */
- #define SIZE (sizeof(unsigned) * BITSperBYTE)
- /* element size in bits */
-
- #define SCRNsize (80) /* # of char on 1 line */
- #define LIMIT (SCRNsize / SIZE) /* max # of elements */
-
- #define BITrangeERR printf("\n\7Bit out of range 1 - %d \n",value)
-
- int value; /* # of bits needed */
-
- main(){
- int i,j, /* indicies */
- max, /* maximum array index */
- ch; /* character input */
-
- void Clear(), PrintBit(), ResetBit(), SetBit(), exit();
-
- printf("\nPlease enter number of bits [1 - %d] needed: ",LIMIT * SIZE);
- scanf("%d", &value);
- ch = getchar(); /* discard remaining \n */
- max = (value - 1) / SIZE; /* find max array index */
- if ( value > 0 && max < LIMIT ) /* if within limits do */
- {
- unsigned BitString[LIMIT]; /* array of bits */
- Clear(BitString, max); /* reset all bits to 0 */
- printf("\n\nCMD> ");
- while ( (ch = getchar()) != EOF ) /* obtain user input */
- {
- switch( ch | 32 )
- {
- case 'c': /* call Clear */
- Clear(BitString, max);
- break;
-
- case 'e':
- exit(0); /* exit to system */
-
- case 'p': /* call PrintBit */
- putchar('\n');
- for ( i = max; i >= 0; i-- )
- PrintBit(BitString[i], i);
- putchar('\n');
- break;
-
- case 's': /* call SetBit */
- if ( GetBit(&i, &j) ) SetBit(&BitString[i], j);
- else BITrangeERR;
- break;
-
- case 'r': /* call ResetBit */
- if ( GetBit(&i, &j) ) ResetBit(&BitString[i], j);
- else BITrangeERR;
- break;
-
- case 't': /* call TestBit */
- if ( GetBit(&i, &j) )
- printf("\nBit set is %c\n",(TestBit(BitString[i], j)) ? 'T' : 'F');
- else BITrangeERR;
- break;
-
- default:
- printf("\nUsage C - clear, E - exit, P - print, R - reset, S - set, T - test\n");
- }
- ch = getchar(); /* clear remaining \n */
- printf("\nCMD> ");
- }
- }
- else printf("\nValue entered is out of range.\n");
- }
-
-
- /* Clear working bit string array to all 0's */
-
- static void Clear(bs, m)
- unsigned *bs; /* array of bits */
- int m; /* max array index */
- {
- register int i;
- for (i = 0; i <= m; i++, bs++) /* exclusive OR elmnts */
- *bs ^= *bs; /* to set to all 0's */
- }
-
-
- /* Obtain bit number from user, return elmnt index, and off set within elmnt */
-
- static int GetBit(index, offset)
- int *index, /* index of array */
- *offset; /* offset within elmnt */
- {
- int bit, /* bit number to use */
- ok = 0; /* assume false */
-
- printf("\nPlease enter the bit # [1 - %d] ",value);
- if ((ok = scanf("%d", &bit) &&
- bit <= value && bit > 0)) { /* int and within range? */
- *index = (bit - 1)/SIZE; /* find index */
- *offset = (bit % SIZE == 0) ? SIZE : bit % SIZE;
- } /* find offset */
- return(ok); /* return validity */
- }
-
-
- /* Print valid bits of a given array element */
-
- static void PrintBit(element, index)
- unsigned element; /* array element */
- int index; /* index of array elmnt */
- {
- register int i;
-
- for (i = SIZE; i > 0; i--) /* for each bit */
- if (index * SIZE + i <= value) /* if within range */
- putchar((element & (HEX1 << (i - 1))) ? '1' : '0');
- }
-
-
- /* Set specified bit */
-
- static void SetBit(element, offset)
- unsigned *element; /* array element */
- int offset; /* offset within elmnt */
- { /* OR original with 1 */
- *element |= (HEX1 << offset - 1); /* shifted to crct pos */
- }
-
-
- /* Reset a specified bit */
-
- static void ResetBit(element, offset)
- unsigned *element; /* array element */
- int offset; /* offset within elmnt */
- {
- static unsigned mask = HEX1; /* 000...1 */
-
- mask <<= SIZE - 1; /* shift left 100...0 */
- mask = ~(mask >> SIZE - offset); /* shift rt to crct pos */
- *element &= mask; /* AND with original */
- }
-
-
- /* Test specified bit, return non-zero if set else return zero */
-
- static int TestBit(element, offset)
- unsigned element; /* array element */
- int offset; /* offset within elmnt */
- {
- element <<= SIZE - offset; /* remove left portion */
- return(element >>= SIZE - 1); /* shift right */
- }
-