What is Bitwise Structure?
C programming Language
Chapter 12:
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.
Bitwise Structures
Lecturer: Natalie Fridman
Based on slides created by Meir Kalech
What is Bitwise Structure?
What is Bitwise Structure?
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).
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!!!
4
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:
Bitwise Operators Examples
11010011
&
10001100
-----------10000000
~11010011
-----------00101100
11010011
|
10001100
-----------11011111
11010011>>3
-----------00011010
Bitwise Operators
11010011
^
10001100
-----------01011111
&
|
^
~
<<
>>
11010011<<3
-----------10011000
bitwise AND
bitwise OR
bitwise XOR
1s compliment
Shift left
Shift right
All these operators can be suffixed with =
For instance a &= b; is the same as a = a & b;
7
Bitwise Operators
truth table
Setting Bits
How can we set a bit on or off?
a&b
a|b
a^b
~a
Manipulations on bits are enabled by
mask and bitwise operators.
Bitwise OR of anything with 1 results
in 1.
Bitwise AND of anything with 0
results in 0.
8
Getting Bits
Setting Bits
How
can we know if a bit is on
or off?
For instance, how can we turn on
the light in room #3?
lights: 00000000
Manipulations
on bits are
enabled by mask and bitwise
operators.
char lights = 0x0;
char mask = 0x1;
mask <<= 2;
lights |= mask;
Bitwise
AND of anything with 1
results in the same value.
mask: 00000001
mask: 00000100
lights: 00000100
11
Getting Bits
Setting Bits
For instance, how can we check if
the light in room #3 is turned on or
off?
char lights = 0x27;
char mask = 0x1;
mask <<= 2;
if(lights & mask)
puts(turned on);
else
puts(turned off);
lights: 00100111
lights: 00100111
char lights = 0x27;
char mask = 0xfb;
lights &= mask;
mask: 00000001
mask: 00000100
mask: 11111011
lights: 00100011
lights & mask: 00000100
12
For instance, how can we turn off
the light in room #3?
10
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;
}
}
Bitwise - Example
Suppose we have 8 rooms:
lights
0 0 0 0 0 0 0 1
mask
Light is on in the rooms requested by the
user.
Print which rooms are lighted.
0 0 0 0 0 0 1 0
answer: 0 (no)
void main()
{
unsigned char lights = 0;
set_lights(&lights);
print_lights(lights);
}
*lights |= mask
0 0 0 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;
}
}
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;
}
}
lights
0 0 0 0 0 0 0 1
mask
0 0 0 0 0 1 0 0
answer: 1 (yes)
*lights |= mask
0 0 0 0 0 1 0 1
16
13
lights
0 0 0 0 0 0 0 0
mask
0 0 0 0 0 0 0 1
answer: 1 (yes)
*lights |= mask
0 0 0 0 0 0 0 1
14
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);
}
}
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;
}
}
lights
0 0 0 0 1 1 0 1
mask
0 0 0 0 0 0 1 0
lights & mask
0 0 0 0 0 0 0 0
Output:
lights
0 0 0 0 0 1 0 1
mask
0 0 0 0 1 0 0 0
answer: 1 (yes)
*lights |= mask
0 0 0 0 1 1 0 1
room #2 is NOT lighted
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);
}
}
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 0 0 1 1 0 1
mask
0 0 0 0 0 1 0 0
lights & mask
0 0 0 0 0 1 0 0
Output:
room #3 is lighted
20
17
lights
0 0 0 0 1 1 0 1
mask
0 0 0 0 0 0 0 1
lights & mask
0 0 0 0 0 0 0 1
Output:
room #1 is lighted
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 lit, j+1);
else
printf(room #%d is NOT lit, j+1);
}
}
lights
0 0 0 0 1 1 0 1
mask
0 0 0 0 1 0 0 0
lights & mask
0 0 0 0 1 0 0 0
Output:
room #4 is lighted
21