C programming Language Chapter 9 Bitwise Structures 04

C programming Language Chapter 9: Bitwise Structures ספטמבר 04 Copyright Meir Kalech 1

What is Bitwise Structure? n n n The smallest type is of 8 bits (char). Sometimes we need only a single bit. For instance, storing the status of the lights in 8 rooms: n n We need to define an array of at least 8 chars. If the light of room 3 is turned on the value of the third char is 1, otherwise 0. Total array of 64 bits. EXPENSIVE in place and time!!! ספטמבר 04 Copyright Meir Kalech 2

What is Bitwise Structure? n n It is better to define only 8 bits since a bit can also store the values 0 or 1. But the problem is that there is no C type which is 1 bit long (char is the longer with 1 byte). Solution: define a char (8 bits) but refer to each bit separately. Bitwise operators, introduced by the C language, provide one of its more powerful tools for using and manipulating memory. They give the language the real power of a “low-level language”. ספטמבר 04 Copyright Meir Kalech 3

What is Bitwise Structure? n n Accessing bits directly is fast and efficient, especially if you are writing a real-time application. A single bit cannot be accessed directly, since it has no address of its own. The language introduces the bitwise operators, which help in manipulating a single bit of a byte. bitwise operators may be used on integral types only (unsigned types are preferable). ספטמבר 04 Copyright Meir Kalech 4

Bitwise Operators & | ^ ~ << >> bitwise AND bitwise OR bitwise XOR 1’s compliment Shift left Shift right All these operators can be suffixed with = For instance a &= b; is the same as a = a & b; ספטמבר 04 Copyright Meir Kalech 5

Bitwise Operators – truth table a b a&b a|b a^b ~a 0 0 0 1 0 1 1 0 0 1 1 1 1 0 0 ספטמבר 04 Copyright Meir Kalech 6

Bitwise Operators Examples 11010011 & 10001100 ------10000000 ~11010011 ------00101100 ספטמבר 04 11010011 | 10001100 ------11011111 11010011>>3 ------00011010 Copyright Meir Kalech 11010011 ^ 10001100 ------01011111 11010011<<3 ------10011000 7

Setting Bits n How can we set a bit on or off? n Manipulations on bits are enabled by mask and bitwise operators. n Bitwise OR of anything with 1 results in 1. n Bitwise AND of anything with 0 results in 0. ספטמבר 04 Copyright Meir Kalech 8

Setting Bits n For instance, how can we turn on the light in room #3? lights: 0000 char lights = 0 x 0; char mask = 0 x 1; mask <<= 2; lights |= mask; mask: 00000001 mask: 00000100 lights: 00000100 ספטמבר 04 Copyright Meir Kalech 9

Setting Bits n For instance, how can we turn off the light in room #3? lights: 00100111 char lights = 0 x 27; char mask = 0 xfb; lights &= mask; ספטמבר 04 mask: 11111011 lights: 00100011 Copyright Meir Kalech 10

Getting Bits n How can we know if a bit is on or off? n Manipulations on bits are enabled by mask and bitwise operators. n Bitwise AND of anything with 1 results in the same value. ספטמבר 04 Copyright Meir Kalech 11

Getting Bits n For instance, how can we check if the light in room #3 is turned on or off? char lights = 0 x 27; char mask = 0 x 1; mask <<= 2; if(lights & mask) puts(“turned on”); else puts(“turned off”); ספטמבר 04 lights: 00100111 mask: 00000001 mask: 00000100 lights & mask: 00000100 Copyright Meir Kalech 12

Bitwise - Example Suppose we have 8 rooms: n n Light is on in the rooms requested by the user. Print which rooms are lighted. void main() { unsigned char lights = 0; set_lights(&lights); print_lights(lights); } ספטמבר 04 Copyright Meir Kalech 13

Bitwise - Example void set_lights(unsigned char *lights) { int j, answer; unsigned char mask; for(j=0, mask=1; j<8; j++, mask<<=1) { answer=0; printf(“lights in room #%d? ”, j+1); scanf(“%d”, &answer); if(answer) *lights |= mask; } } ספטמבר 04 Copyright Meir Kalech lights 0 0 0 0 mask 0 0 0 0 1 answer: 1 (yes) *lights |= mask 0 0 0 0 1 14

Bitwise - Example void set_lights(unsigned char *lights) { int j, answer; unsigned char mask; for(j=0, mask=1; j<8; j++, mask<<=1) { answer=0; printf(“lights in room #%d? ”, j+1); scanf(“%d”, &answer); if(answer) *lights |= mask; } } ספטמבר 04 Copyright Meir Kalech lights 0 0 0 0 1 mask 0 0 0 1 0 answer: 0 (no) *lights |= mask 0 0 0 0 1 15

Bitwise - Example void set_lights(unsigned char *lights) { int j, answer; unsigned char mask; for(j=0, mask=1; j<8; j++, mask<<=1) { answer=0; printf(“lights in room #%d? ”, j+1); scanf(“%d”, &answer); if(answer) *lights |= mask; } } ספטמבר 04 Copyright Meir Kalech lights 0 0 0 0 1 mask 0 0 0 1 0 0 answer: 1 (yes) *lights |= mask 0 0 0 1 16

Bitwise - Example void set_lights(unsigned char *lights) { int j, answer; unsigned char mask; for(j=0, mask=1; j<8; j++, mask<<=1) { answer=0; printf(“lights in room #%d? ”, j+1); scanf(“%d”, &answer); if(answer) *lights |= mask; } } ספטמבר 04 Copyright Meir Kalech lights 0 0 0 1 mask 0 0 1 0 0 0 answer: 1 (yes) *lights |= mask 0 0 1 17

Bitwise - Example void print_lights(unsigned char lights) { int j; unsigned char mask; for(j=0, mask=1; j<8; j++, mask<<=1) { if(lights & mask) printf(“room #%d is lighted”, j+1); else printf(“room #%d is NOT lighted”, j+1); } } lights 0 0 1 1 0 1 mask 0 0 0 0 1 lights & mask 0 0 0 0 1 Output: room #1 is lighted ספטמבר 04 Copyright Meir Kalech 18

Bitwise - Example void print_lights(unsigned char lights) { int j; unsigned char mask; for(j=0, mask=1; j<8; j++, mask<<=1) { if(lights & mask) printf(“room #%d is lighted”, j+1); else printf(“room #%d is NOT lighted”, j+1); } } lights 0 0 1 1 0 1 mask 0 0 0 1 0 lights & mask 0 0 0 0 Output: room #2 is NOT lighted ספטמבר 04 Copyright Meir Kalech 19

Bitwise - Example void print_lights(unsigned char lights) { int j; unsigned char mask; for(j=0, mask=1; j<8; j++, mask<<=1) { if(lights & mask) printf(“room #%d is lighted”, j+1); else printf(“room #%d is NOT lighted”, j+1); } } lights 0 0 1 1 0 1 mask 0 0 0 1 0 0 lights & mask 0 0 0 1 0 0 Output: room #3 is lighted ספטמבר 04 Copyright Meir Kalech 20

Bitwise - Example void print_lights(unsigned char lights) { int j; unsigned char mask; for(j=0, mask=1; j<8; j++, mask<<=1) { if(lights & mask) printf(“room #%d is lit”, j+1); else printf(“room #%d is NOT lit”, j+1); } } lights 0 0 1 1 0 1 mask 0 0 1 0 0 0 lights & mask 0 0 1 0 0 0 Output: room #4 is lighted ספטמבר 04 Copyright Meir Kalech 21
- Slides: 21