Expression |
returns... |
Reason |
3 & 4 |
0 |
3 is 011 in binary and 4 is 100. Comparing the bits using AND, you'd get 000 which is zero. |
5 & 4 |
4 |
5 is 4+1, which is 101 in binary. 4 is simply 100, so 5 & 4 returns 100 in binary, which is decimal 4. |
8 & 7 |
0 |
8 is simply 1000. 7 is 0111. So 8 & 7 returns 0000 in binary, which is zero. |
16 & 6 |
0 |
16 is 10000. 6 is 00110. So 16 & 6 returns 00000 in binary, which is zero. |
24 & 16 |
16 |
24 is 16+8, which is 11000 in binary. 16 is simply 10000. So 24 & 16 returns 10000 in binary, which is 16. |
32 & 16 |
0 |
Now we're comparing 2 powers of 2 using bitwise AND. In the cases when the powers are different, the result is always zero: 32 is 100000, 16 is 010000 and since the 1 occurs in different places, 32 & 16 is 0. |
17 && 23 |
1 |
Trick question!! Remember that bitwise AND is just &, where as logical AND is &&. Since both operands are non zero, 1 is returned by logical AND. |
8 ^ 12 |
4 |
Now for bitwise XOR. 8 is 1000, 12 is 8+4, which is 1100. Now, 1 XOR 1 is zero because BOTH operands is one. The a XOR b returns 1 if only one of a or b are 1. So 8 ^ 12 returns 0100, which is 4 in decimal. |
1 ^ 17 |
16 |
1 is simply 00001, 17 is 16+1, which is 10001 in binary. Doing a XOR comparison, we see that 1 ^ 17 returns 10000, which is 16. |
3 ^ 8 |
11 |
3 is 2+1, which is 0011 in binary, 8 is 1000. Doing a XOR comparison, we see that 3 ^ 8 returns 1011, which is 8+2+1 = 11. |
13 | 23 |
31 |
Now for bitwise OR. 13 is 8+4+1, so it's 01101 in binary. 23 is 16+4+2+1, so it's 10111 in binary. Unlike XOR, a OR b returns 1 if any of the operands are 1. So applying bitwise OR, 13 | 23 is 11111, which is 31. |
16 | 4 |
20 |
Here's another trick: if you're comparing 2 different powers of 2 using bitwise OR, you simply add them. So 16 | 4 returns 16 + 4 =20. |
3 | 10 |
11 |
3 is 0011 in binary. 10 is 1010. So 3 | 10 is 1011, which is 11. |
8 | 3 |
11 |
8 is 1000 in binary. 3 is 0011. So 8 | 3 is 1011, which is 11. |
5 | 3 |
7 |
5 is 101 in binary. 3 is 011. So 5 | 3 is 111, which is 7. |
8 | 10 |
10 |
8 is 1000 in binary. 10 is 1010. So 8 | 10 is 1010, which is 10. |
32 | 64 |
96 |
We are comparing 2 different powers of 2 again, using bitwise OR. So we just add them to get 96 as the return value. |
3 ^ 5 |
6 |
Back to XOR, 3 is 011 in binary, 5 is 101. So 3 ^ 5 returns 110, which is 6 in decimal. |
6 ^ 13 |
11 |
6 is 0110 in binary, 13 is 1101. So 6 ^ 13 returns 1011, which is 11 in decimal. |
20 ^ 20 |
0 |
You may have noticed that a & a and a | a return a. But a ^ a always returns 0. |
Expression |
returns... |
Reason |
3 << 0 |
3 |
Shifting zero places has no effect! |
4 << 1 |
8 |
Shifting 4 once to the left is the same as multiplying 4 by 2. |
7 << 3 |
56 |
Shifting 7 3 times to the to the left is the same as multiplying 7 by 23, so 7*8 = 56. |
3 << 4 |
48 |
Shifting 3 4 times to the to the left is the same as multiplying 3 by 24, so 3*16 = 48. |
2 << 5 |
64 |
2*25 is 2*32 = 64. |
32 >> 2 |
8 |
This is the same as saying 32/22 i.e. 32/4, which is 8. |
34 >> 3 |
4 |
23 is 8. But 34/8 is 4.25, which rounds down to 4. |
56 >> 4 |
3 |
24 is 16, and 56/16 is 3.5, which rounds down to 3. |
100 >> 5 |
3 |
25 is 32, and 100/32 is 3.125, which also rounds down to 3. |
1 >> 6 |
0 |
26 is 64, and 1/64 is 0.015625, which rounds down to 0. |