Arduino Programming Language: Bitshift

Name

bitshift left (<<), bitshift right (>>)

Description

These operators cause the bits in the left operand to be shifted left or right by the number of positions specified by the right operand.

Syntax

variable << number_of_bits
variable >> number_of_bits

Parameters

  • variable: (byte, int, long)
  • number_of_bits integer: <= 32

Usage

Application

Warning

When you shift a value x by y bits (x << y), the leftmost y bits in x are lost, literally shifted out of existence:

int a = 5; // binary: 0000000000000101 
int b = a << 14; // binary: 0100000000000000 - the first 1 in 101 was discarded

When you shift x right by y bits (x >> y), and the highest bit in x is a 1, the behavior depends on the exact data type of x. If x is of type int, the highest bit is the sign bit, determining whether x is negative or not, as we have discussed above. In that case, the sign bit is copied into lower bits, for esoteric historical reasons:

int x = -16; // binary: 1111111111110000 
int y = x >> 3; // binary: 1111111111111110

This behavior, called sign extension, is often not the behavior you want. Instead, you may wish zeros to be shifted in from the left. It turns out that the right shift rules are different for unsigned int expressions, so you can use a typecast to suppress ones being copied from the left:

int x = -16; // binary: 1111111111110000 
int y = (unsigned int)x >> 3; // binary: 0001111111111110

If you are careful to avoid sign extension, you can use the right-shift operator >> as a way to divide by powers of 2. For example:

int x = 1000; 
int y = x >> 3; // integer division of 1000 by 8, causing y = 125.

Examples

bitshift left (<<):

unsigned int value=4; // 4 = 0000 0100
unsigned int shift=2;
value = value << shift; // 16 = 0001 0000

bitshift right (>>):

unsigned int value=4; // 4 = 0000 0100
unsigned int shift=1;
value = value << shift; // 16 = 0001 0000


Based on the reference originally written by Arduino Community,  wiring.org.co and  arduino.cc