<<= and >>= are bit shifting operators.
<<= shifts the bits so that they are more significant, while >>= shifts them so they are less.
For example:
int a = 1;
a <<= 1;
Now a is equal to 2.
This is what the bits stored on the hard drive referred to as a in this example look like:
| Code | Space on hard drive for a |
integer value of a |
|---|---|---|
int a = 1; |
0000 0000 0000 0001 |
1 |
a <<= 1; |
0000 0000 0000 0010 |
2 |
So, you see, after the <<= the value of a is actually 2.
If we shifted it again in the same direction, it would then be 4.
Another quick example:
| Code | Space on hard drive for a |
integer value of a |
|---|---|---|
int a = 3; |
0000 0000 0000 0011 |
3 |
a <<= 2; |
0000 0000 0000 1100 |
12 |
In this case, we started with a being 3, we shift it left 2 spaces, which ends up with a being equal to 12.
The opposite holds true for >>=. If you do a right shift on 3 by 1 space, you'll end up with 1.
| Code | Space on hard drive for a |
integer value of a |
|---|---|---|
int a = 3; |
0000 0000 0000 0011 |
3 |
a >>= 1; |
0000 0000 0000 0001 |
1 |
The "extra" 1 that we shifted out of range, just goes away.
Now, on to &=, ^=, |=. These are doing the basic bitwise operations.
& is a bitwise and, the resulting bits will be 'on' if the corresponding bits in both variables are on
| is a bitwise or, the resulting bits will be 'on' if the either the original bits or the comparative bits are on
^ is a bitwise exlusive or, the resulting bits will be 'on' only if the bits in the original were on or the comparitive bits are on, but not if both are
Examples for these cases:
&= case
| Code | Space on hard drive for a |
integer value of a or b |
|---|---|---|
int a = 3; |
0000 0000 0000 0011 |
a is 3 |
int b = 2; |
0000 0000 0000 0010 |
b is 2 |
a &= b; |
0000 0000 0000 0010 |
a is 2 |
|= case
| Code | Space on hard drive for a |
integer value of a or b |
|---|---|---|
int a = 11; |
0000 0000 0000 1011 |
a is 11 |
int b = 4; |
0000 0000 0000 0100 |
b is 4 |
a l= b; |
0000 0000 0000 1111 |
a is 15 |
That table doesn't format correctly... It interprets the |= as a column separator, so imagine that the l= in the bottom left cell is actually a |= ;-)
^= case
| Code | Space on hard drive for a |
integer value of a or b |
|---|---|---|
int a = 11; |
0000 0000 0000 1011 |
a is 11 |
int b = 2; |
0000 0000 0000 1110 |
b is 2 |
a ^= b; |
0000 0000 0000 0101 |
a is 5 |
There are actually a few other logical bitwise operations... Here is a breakdown of all that I remember off-hand:
AND-&- If both inputs are true, then the output is true.OR-|- If either of the inputs are true, then the output is true.XOR-^- EXCLUSIVE OR - If either, but not both, of the inputs is true, then the output is true.NOR- NOT OR - The opposite ofOR, if at least one input is true, then the output is false.NAND- NOT AND - The opposite ofAND, if at least one input if false, then the output is true.XNOR- NOT EXCLUSIVE OR - The opposite ofXOR, if both inputs are the same, the output is true.
In my day, the way that we learned about bitwise operations is by using what are called Truth Tables.
Here is a quick one-off truth table that runs through the bitwise operations given two inputs p and q
| P | Q | AND |
OR |
XOR |
NOR |
NAND |
XNOR |
|---|---|---|---|---|---|---|---|
| 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 |
| 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 |
| 0 | 1 | 0 | 1 | 1 | 0 | 1 | 0 |
| 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 |