The << and >> operators are used to perform bit shifting operations.
shift-expression:
additive-expression
shift-expression << additive-expression
shift-expression >> additive-expression
For an operation of the form x << count or x >> count, binary operator
overload resolution (?4.2.4) is
applied to select a specific operator implementation. The operands are
converted to the parameter types of
the selected operator, and the type of the result is the return type of the
operator.
Chapter 14 Expressions
163
When declaring an overloaded shift operator, the type of the first operand
must always be the class or struct
containing the operator declaration, and the type of the second operand
must always be int.
The predefined shift operators are listed below.
?Shift left:
int operator <<(int x, int count);
uint operator <<(uint x, int count);
long operator <<(long x, int count);
ulong operator <<(ulong x, int count);
The << operator shifts x left by a number of bits computed as described
below.
The high-order bits outside the range of the result type of x are
discarded, the remaining bits are shifted
left, and the low-order empty bit positions are set to zero.
?Shift right:
int operator >>(int x, int count);
uint operator >>(uint x, int count);
long operator >>(long x, int count);
ulong operator >>(ulong x, int count);
The >> operator shifts x right by a number of bits computed as described
below.
When x is of type int or long, the low-order bits of x are discarded, the
remaining bits are shifted
right, and the high-order empty bit positions are set to zero if x is
non-negative and set to one if x is
negative.
When x is of type uint or ulong, the low-order bits of x are discarded, the
remaining bits are shifted
right, and the high-order empty bit positions are set to zero.
For the predefined operators, the number of bits to shift is computed as
follows:
?When the type of x is int or uint, the shift count is given by the
low-order five bits of count. In other
words, the shift count is computed from count & 0x1F.
?When the type of x is long or ulong, the shift count is given by the
low-order six bits of count. In
other words, the shift count is computed from count & 0x3F.
If the resulting shift count is zero, the shift operators simply return the
value of x.
Shift operations never cause overflows and produce the same results in
checked and unchecked contexts.
When the left operand of the >> operator is of a signed integral type, the
operator performs an arithmetic
shift right wherein the value of the most significant bit (the sign bit) of
the operand is propagated to the
high-order empty bit positions. When the left operand of the >> operator is
of an unsigned integral type, the
operator performs a logical shift right wherein high-order empty bit
positions are always set to zero. To
perform the opposite operation of that inferred from the operand type,
explicit casts can be used. [Example:
For example, if x is a variable of type int, the operation
unchecked((int)((uint)x >> y)) performs a
logical shift right of x. end example]