Following are the Bit-wise operators
- Bit-wise AND
- Bit-wise OR
- Bit-wise XOR
- Bit-wise NOT (One's complement)
- Bit-wise left shift
- Bit-wise right shift
Bit-wise AND
'&' is the bit-wise AND operator in C. The various combination of the o/p is discussed below
A
|
B
|
A and B
|
0
|
0
|
0
|
0
|
1
|
0
|
1
|
0
|
0
|
1
|
1
|
1
|
Above truth table tells how it works on 1 bit, say we want to find bit-wise AND of 25 & 35. First we need to find binary representation of each, 25 = 0001 1001 and 35 = 0010 0011. Write down both the representation one below another and work on finding the corresponding bit AND.
0001 1001
0010 0011
& ---------
0000 0001
The result is 0000 0001 in binary which is 1 in decimal.
Say we had done Logical AND between 25 and 35 then; 25 = non-zero(true), 35 means non-zero(true). hence Logical AND between them is true, which means 1. In this particular case the result is same for logical and bit-wise AND. Take another example of 25 and 34. Logical AND - 1; Bit-wise AND - 0
Hence be very careful.
Same can be implemented as C Program as follows
(Note in the following example data type unsigned char is used to store integer, rather than ASCII value !!)
#include <stdio.h> int main() { unsigned char a = 25; unsigned char b = 35; printf("Bitwise AND between a and b is %d\n", a & b); printf("Logical AND between a and b is %d\n", a && b ); printf("Bitwise AND between 25 and 34 is %d\n", 25 & 34); printf("Logical AND between 25 and 34 is %d\n", 25 && 34 ); return 0; }
output of the above program is
Bitwise AND between a and b is 1 Logical AND between a and b is 1 Bitwise AND between 25 and 34 is 0 Logical AND between 25 and 34 is 1
One of primary use of AND operator is to make particular bit/bits position as 0 (called as resetting a bit). Say i want to reset BIT position 2 of number 19 (0001 0011 in binary). Then we need to create a mask first; that has all bits 1 except bit 2, which is 1111 1101 in binary. Which is FD in hex which is represented as 0xFD. (In C).
Doing the Bitwise AND
0001 0011
& 1111 1101
------------
0001 0001
Result is 0001 0001(binary) which is 17 in decimal. We can also reset multiple bits too.
#include <stdio.h> int main() { unsigned char a = 19; printf("Second Bit reset of a %d\n", a & 0xFD); printf("First Bit and Second Bit reset of a %d\n", a & 0xFC); return 0; }
Output of the above program is
Second Bit reset of a 17 First Bit and Second Bit reset of a 16
Bitwise OR
'|' is the bitwise OR operator in C. The various combination of the o/p is discussed below
A
|
B
|
A or B
|
0
|
0
|
0
|
0
|
1
|
1
|
1
|
0
|
1
|
1
|
1
|
1
|
Above Truth table tells how it works on 1 bit, say we want to find Bitwise OR of 25 & 35.
0001 1001
0010 0011
| ---------
0011 1011
The result is 0011 1011 in binary which is 59 in decimal. While the Logical OR between these two value is 1.
Following C program that does the same.
#include <stdio.h> int main() { unsigned char a = 25; unsigned char b = 35; printf("Bitwise OR between a and b is %d\n", a | b); printf("Logical OR between a and b is %d\n", a || b ); return 0; }
output of the above program is
Bitwise OR between a and b is 59 Logical OR between a and b is 1
Doing the Bitwise OR
0001 0011
& 0000 0100
------------
0001 0111
Result is 0001 0111(binary) which is 23 in decimal. We can also reset multiple bits too.
#include <stdio.h> int main() { unsigned char a = 19; printf("Second Bit set of a %d\n", a | 0x04); printf("Third Bit and Fourth Bit set of a %d\n", a | 0x0C); return 0; }
Output of the above program is
Second Bit set of a 23 Third Bit and Fourth Bit set of a 31
Bitwise XOR
'^' is the bitwise XOR operator in C. The various combination of the o/p is discussed below
A
|
B
|
A xor B
|
0
|
0
|
0
|
0
|
1
|
1
|
1
|
0
|
1
|
1
|
1
|
0
|
0001 1001
0010 0011
^ ---------
0011 1010
The result is 0011 1010 in binary which is 58 in decimal. Note that there is no Logical XOR.
Following C program that does the same.
#include <stdio.h> int main() { unsigned char a = 25; unsigned char b = 35; printf("Bit-wise XOR between a and b is %d\n", a ^ b); return 0; }
Bit-wise XOR between a and b is 58
Doing the Bit-wise XOR
0001 0011
^ 0000 0110
------------
0001 0101
Result is 0001 0101(binary) which is 21 in decimal.
#include <stdio.h> int main() { unsigned char a = 19; printf("Toggle bit 2 and 3 of a is %d\n", a ^ 0x06); return 0; }
Toggle bit 2 and 3 of a is 21
Bit-wise NOT
'~' is the bit-wise NOT operator in C. The various combination of the o/p is discussed below
A
|
NOT A
|
0
|
1
|
1
|
0
|
~ 0001 1001
------------
1110 0110
The result is 1110 0110 in binary which is 230 in decimal. This is very different from Logical NOT. Logical NOT of 25 would be 0.
Following C program that does the same.
#include <stdio.h> int main() { unsigned char a = 25; printf("Bitwise NOT of a is %d\n", (unsigned char)~a); printf("Logical NOT of a is %d\n", !a); return 0; }
output of the above program is
Bitwise NOT of a is 230 Logical NOT of a is 0
Bit-wise left shift
'<<' is the bit-wise left shift operator in C.Syntax is as follows
a << b
Then a is shifted by b bits to left
For example
23 << 3
Convert 23 into binary which is 0001 0111. shifting it by 3 bits is 1011 1000 which is 184
Program that depicts left shift
#include <stdio.h> int main() { unsigned char a = 23; printf("Left shift 23 by 3 is %d\n", a << 3); return 0; }
Left shift 23 by 3 is 184
Bit-wise right shift
'>>' is the bit-wise right shift operator in C.Syntax is as follows
a >> b
Then a is shifted by b bits to right.
For example
23 >> 1
Convert 23 into binary which is 0001 0111, shifting it by 1 bits is 0000 1011 towards right which is 11 in decimal.
Program that depicts right shift
#include <stdio.h> int main() { unsigned char a = 23; printf("Right shift 23 by 1 is %d\n", a >> 1); return 0; }
Right shift 23 by 1 is 11
Links
Quiz - Not Yet written !!Next Article - C Programming #11: Operators - Conditional
No comments :
Post a Comment