java bitwise operator:
~ The unary bitwise complement operator "
~
" inverts a bit
pattern.
<<The signed left shift
>>The signed right shift
>>>the unsigned right shift
& The bitwise &
operator performs a bitwise AND
operation.
^ The bitwise ^
operator performs a bitwise exclusive OR
operation.
| The bitwise |
operator performs a bitwise inclusive OR
operation.
Usage:
1,
^
can swap two variables without using an intermediate,
temporary variable which is useful if you are short on available RAM or
want that sliver of extra speed.
Usually, when not using ^
, you will do:
temp = a;
a = b;
b = temp;
Using ^
, no "temp" is needed:
a ^= b;
b ^= a;
a ^= b;
This will swap "a" and "b" integers. Both must be
integers.
2,
an example of using an integer to maintain state flags (common
usage):
// These are my masks
private static final int MASK_DID_HOMEWORK = 0x0001;
private static final int MASK_ATE_DINNER = 0x0002;
private static final int MASK_SLEPT_WELL = 0x0004;
// This is my current state
private int m_nCurState;
To set my state, I use the bitwise OR
operator:
// Set state for'ate dinner' and 'slept well' to 'on'
m_nCurState = m_nCurState | (MASK_ATE_DINNER | MASK_SLEPT_WELL);
Notice how I 'or' my current state in with the states that I want to
turn 'on'. Who knows what my current state is and I don't want to blow
it away.
To unset my state, I use the bitwise AND
operator with the complement operator:
// Turn off the 'ate dinner' flag
m_nCurState = (m_nCurState & ~MASK_ATE_DINNER);
To check my current state, I use the AND
operator:
// Check if I did my homework
if (0 != (m_nCurState & MASK_DID_HOMEWORK)) {
// yep
} else {
// nope...
}
Why do I think this is interesting? Say I'm designing an interface
that sets my state. I could write a method that accepts three booleans:
void setState( boolean bDidHomework, boolean bAteDinner, boolean bSleptWell);
Or, I could use a single number to represent all three states and
pass a single value:
void setState( int nStateBits);
If you choose the second pattern you'll be very happy when decide to
add another state - you won't have to break existing impls of your
interface.