# << - left shift

suggest change```
#include <iostream>
int main(int argc, char **argv) {
int a = 1; // 0001b
int b = a << 1; // 0010b
std::cout << "a = " << a << ", b = " << b << std::endl;
}
```

```
a = 1, b = 2
```

**Why**

The left bit wise shift will shift the bits of the left hand value (`a`

) the number specified on the right (`1`

), essentially padding the least significant bits with 0’s, so shifting the value of `5`

(binary `0000 0101`

) to the left 4 times (e.g. `5 << 4`

) will yield the value of `80`

(binary `0101 0000`

). You might note that shifting a value to the left 1 time is also the same as multiplying the value by 2, example:

```
int a = 7;
while (a < 200) {
std::cout << "a = " << a << std::endl;
a <<= 1;
}
a = 7;
while (a < 200) {
std::cout << "a = " << a << std::endl;
a *= 2;
}
```

But it should be noted that the left shift operation will shift all bits to the left, including the sign bit, example:

```
#include <iostream>
int main(int argc, char **argv) {
int a = 2147483647; // 0111 1111 1111 1111 1111 1111 1111 1111
int b = a << 1; // 1111 1111 1111 1111 1111 1111 1111 1110
std::cout << "a = " << a << ", b = " << b << std::endl;
}
```

```
a = 2147483647, b = -2
```

While some compilers will yield results that seem expected, it should be noted that if you left shift a signed number so that the sign bit is affected, the result is undefined. It is also undefined if the number of bits you wish to shift by is a negative number or is larger than the number of bits the type on the left can hold, example:

```
int a = 1;
int b = a << -1; // undefined behavior
char c = a << 20; // undefined behavior
```

The bit wise left shift does not change the value of the original values unless specifically assigned to using the bit wise assignment compound operator `<<=`

:

```
#include <iostream>
int main(int argc, char **argv) {
int a = 5; // 0101b
a <<= 1; // a = a << 1;
std::cout << "a = " << a << std::endl;
}
```

```
a = 10
```