~ 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.
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.