Document 7766303
Download
Report
Transcript Document 7766303
Bitwise operators
Representing integers
We typically think in terms of decimal
(base 10) numbers.
Why?
A decimal (or base 10) number consists of a
sequence of decimal digits (0,1,…,9).
192010 = 1x103 + 9x102 + 2x101 + 0x100
Least significant digit
Most significant digit
Representing integers
All numbers within the computer are
stored as binary numbers.
Why?
A binary (or base 2) number consists of a
sequence of bits (0,1).
1100112 =1x25+1x24+0x23+0x22+1x21+1x20
Least significant bit
Most significant bit
Where does the word “bit” come from?
Representing integers
Typical integer sizes:
unsigned char = 8 bits
unsigned short = 16 bits
unsigned int = 32 bits
1100112
• is 001100112 when stored in an unsigned char
• is 00000000001100112 when stored in an unsigned short
• is 000000000000000000000000001100112 when stored
in an unsigned int
• We know that 192010 is the same as 0192010 or
00000000192010.
Boolean (logical) operators
&& is and
|| is or
! is not
Boolean (logical) operators
&& is and
F && F is F
F && T is F
T && F is F
T && T is T
Boolean (logical) operators
|| is or
F || F is F
F || T is T
T || F is T
T || T is T
Boolean (logical) operators
! is not
!F is T
!T is F
Boolean (logical) operators
^ is xor
F ^ F is F
F ^ T is T
T ^ F is T
T ^ T is
F
Bitwise operators (on integers)
& is bitwise and
| is bitwise or
~ is bitwise not (1’s complement)
^ is bitwise xor (exclusive or)
Let’s substitute 1 for T and 0 for F.
Bitwise operators (on integers)
& is bitwise and
110011 (really 00110011 in an 8-bit byte)
& 001111 (really 00001111)
-----------000011 (really 00000011)
Bitwise operators (on integers)
| is bitwise or
110011 (really 00110011 in an 8-bit byte)
| 001111 (really 00001111)
-----------111111 (really 00111111)
Bitwise operators (on integers)
~ is bitwise not (1’s complement)
If x=110011 (really00110011 in an 8-bit
byte) then ~x is
11001100.
Bitwise operators (on integers)
^ is bitwise xor
110011 (really 00110011 in an 8-bit byte)
^ 001111 (really 00001111)
-----------111100 (really 00111100)
Other bitwise operators
<< is shift bits to the left.
1 shift to the left is the same as multiplying by 2.
Examples
10 << 1 is 20
7 << 1 is 14
7 << 3 is 56
(same as multiplying by 23)
Other bitwise operators
>> is shift bits to the right.
1 shift to the right is the same as integer
division by 2.
Examples
10 >> 1 is 5
27 >> 3 is 3
More examples
unsigned int ui=0;
ui = 10 & 7;
ui = 10 | 7;
ui = 10 ^ 7
unsigned char uc = ~12;
Bits as binary flags.
An int is 32 bits so we can number each student
in the class from 0..31. If the bit for a particular
student is 1, then that indicates that they took a
quiz.
First, let’s define the students.
#define S0 (1<<0)
#define S1 (1<<1)
#define S2 (1<<2)
#define S3 (1<<3)
#define S4 (1<<4)
.
.
.
#define S31 (1<<31)
Bits as binary flags.
Now let’s define a quiz.
unsigned int quiz1 = 0;
How can we indicate that students 0, 5,
and 9 took quiz 1?
Bits as binary flags.
Now let’s define a quiz.
unsigned int quiz1 = 0;
How can we indicate that students 0, 5,
and 9 took quiz 1?
quiz1 = (s0 | s5 | s9);
Bits as binary flags.
Now here comes student 12. He takes the
quiz on a subsequent day because he was
ill.
How do we update quiz1 to indicate that
student 12 also took the quiz?
Bits as binary flags.
Now here comes student 12. He takes the
quiz on a subsequent day because he was
ill.
How do we update quiz1 to indicate that
student 12 also took the quiz?
quiz1 |= s12;
Bits as binary flags.
I’d like to write a message that indicates
whether or not student 25 took the exam?
How can I do that?
Bits as binary flags.
I’d like to write a message that indicates whether
or not student 25 took the exam?
How can I do that?
if ((quiz1&s25)!=0)
else
puts(“taken”);
puts(“skipped”);
if ((quiz1&s25)==s25) puts(“taken”);
else
puts(“skipped”);
if (quiz1&s25)
else
puts(“taken”);
puts(“skipped”);
Bits as binary flags.
Did both students 22 and 25 take the
exam?
Bits as binary flags.
Did both students 22 and 25 take the
exam?
if ((quiz1&(s22|s25)) == (s22|s25) )
puts(“taken”);
else
puts(“skipped”);
if ((quiz1&s22)!=0 && (quiz1&s25)!=0) …
Bits as binary flags.
Did everyone except for student 25 take
the exam?
Bits as binary flags.
Did everyone except for student 25 take the
exam?
if ( (quiz1&(~s25)) == (~s25) ) puts(“yes”);
else
puts(“no”);
Bits as binary flags.
I thought student 25 took the exam but I
was mistaken. How can I rectify my
mistake?
Bits as binary flags.
I thought student 25 took the exam but I
was mistaken. How can I rectify my
mistake?
quiz1 = quiz1 & (~s25);
quiz1 &= ~s25;
Bits as binary flags.
Finally, I’d like to print out a list of all of the
students that took exam 1.
Bits as binary flags.
Finally, I’d like to print out a list of all of the
students that took exam 1.
int which = 1;
for (int i=0; i<32; i++) {
?
which <<= 1;
}
Bits as binary flags.
I’d like to print out a list of all of the students that
took exam 1.
int which = 1;
for (int i=0; i<32; i++) {
if (quiz1&which)
printf( “student %d took the quiz. \n”, i );
which <<= 1;
}
Bits as binary flags.
Say I also have quiz1 and quiz2. I’d like a
list of all of the students that took quiz1 or
quiz2 but not both.
Bits as binary flags.
Say I also have quiz1 and quiz2. I’d like a list of all of
the students that took either quiz1 or quiz2 but not both.
int which = 1;
for (int i=0; i<32; i++) {
if ( (quiz1&which) ^ (quiz2&which) )
printf( “student %d took either but not both. \n”, i );
which <<= 1;
}