# What does "<<" (double angle brackets) mean in C/C++ enum?

```enum ofp10_port_state {

OFPPS10_STP_LISTEN  = 0 << 8, /* Not learning or relaying frames. */
OFPPS10_STP_LEARN   = 1 << 8, /* Learning but not relaying frames. */
OFPPS10_STP_FORWARD = 2 << 8, /* Learning and relaying frames. */
OFPPS10_STP_BLOCK   = 3 << 8, /* Not part of spanning tree. */
OFPPS10_STP_MASK    = 3 << 8  /* Bit mask for OFPPS10_STP_* values. */

};
```

Its a left bit shift operator. Meaning it shifts the bits left the indicated number of bits:

say that the value is:

```0x0F or 00001111
0x0F << 4 = 0xF0 or 11110000
```

In microsoft c++ shifts right (>>) keep the sign (or the most significant digit, the one on the far left) depending on if the number is signed or unsigned

(assuming size of a byte):

```signed integer (an int for example):
0x80 or 10000000
0x80 >> 7 = 11111111
0x10 or 00010000
0x10 >> 4 = 00000001
if its unsigned (a uint):
0x80 or 10000000
0x80 >> 7 = 00000001
0x10 or 00010000
0x10 >> 4 = 00000001
```

<< is a left bitshift operator.

If you have a bit pattern like 0010 (2 in decimal) and shift it to the left by 2 like so 0010<<2, you get 1000 (8 in decimal).

An enum is simply an integer that is large enough to hold at least an int. Thus we can directly assign int values like 0, 1, etc. to it.

In this case, we are assigning things like 1 << 8 to it (which yields 100000000 or 256 in decimal).