/* bitwise.c Jeff Ondich, 9 Jan 2022 Some bitwise logical operations (|, &, >>) */ #include void print_binary(int n, FILE *stream); int main(int argc, char *argv[]) { // Experiment 1 printf("===== 1. bitwise OR to turn a bit on =====\n"); int a = 0x00000023; int bit = 0x00000080; int b = a | bit; printf("a=%d, bit=%d, b=%d\n", a, bit, b); printf("a = "); print_binary(a, stdout); printf("\nbit = "); print_binary(bit, stdout); printf("\nb = "); print_binary(b, stdout); printf("\n\n"); // Experiment 2 printf("===== 2. bitwise AND to turn a bit off =====\n"); a = 0x00000023; int mask = 0xFFFFFFFD; b = a & mask; printf("a=%d, mask=%d, b=%d\n", a, mask, b); printf("a = "); print_binary(a, stdout); printf("\nmask = "); print_binary(mask, stdout); printf("\nb = "); print_binary(b, stdout); printf("\n\n"); // Experiment 3 printf("===== 3. bitwise AND to mask out all but lower-order byte =====\n"); a = 0x1234ABCD; mask = 0x000000FF; b = a & mask; printf("a=%d, mask=%d, b=%d\n", a, mask, b); printf("a = "); print_binary(a, stdout); printf("\nmask = "); print_binary(mask, stdout); printf("\nb = "); print_binary(b, stdout); printf("\n\n"); // Experiment 4 printf("===== 4. bit shift to move middle bits to low-order bits =====\n"); a = 0x1234ABCD; int shift = 8; b = a >> shift; printf("a=0x%X, shift=0x%X, b=0x%X\n", a, shift, b); printf("a = "); print_binary(a, stdout); printf("\nshift = "); print_binary(shift, stdout); printf("\nb = "); print_binary(b, stdout); printf("\n\n"); // Experiment 5 printf("===== 5. what if a is negative =====\n"); a = 0x8765ABCD; shift = 8; b = a >> shift; printf("a=0x%X, shift=0x%X, b=0x%X\n", a, shift, b); printf("a = "); print_binary(a, stdout); printf("\nshift = "); print_binary(shift, stdout); printf("\nb = "); print_binary(b, stdout); printf("\n\n"); // Experiment 6 printf("===== 6. building a mask =====\n"); a = 0x1234ABCD; // I want to zero out bits 8-11 (i.e. the B in that hexadecimal) int inverted_mask = 0x00000F00; // the bits I want to squash are the four bits (8-11) covered by the F mask = ~inverted_mask; // this bitwise NOT converts 0x0000F000 to 0xFFFF0FFF printf("a=0x%X, inverted_mask=0x%X, mask=0x%X\n", a, inverted_mask, mask); printf("a & mask: 0x%X\n", a & mask); printf("\n\n"); return 0; } void print_binary(int n, FILE *stream) { int bits_printed = 0; for (unsigned int k = 0x80000000; k != 0; k = (k >> 1)) { char bit = (k & n) != 0 ? '1' : '0'; fputc(bit, stream); bits_printed++; if ((bits_printed % 4) == 0) { fputc(' ', stream); } } }