Function of '<<'

I am working through the ShiftOut Tutorial in Code Sample 1.3 Using an array. The code in question is

/*
Shift Register Example
Turning on the outputs of a 74HC595 using an array

Hardware:
* 74HC595 shift register
* LEDs attached to each of the outputs of the shift register

*/
//Pin connected to ST_CP of 74HC595
int latchPin = 8;
//Pin connected to SH_CP of 74HC595
int clockPin = 12;
////Pin connected to DS of 74HC595
int dataPin = 11;

//holders for information you're going to pass to shifting function
byte data;
byte dataArray[10];

void setup()
{
	//set pins to output because they are addressed in the main loop
	pinMode(latchPin, OUTPUT);
	pinMode(clockPin, OUTPUT);
	pinMode(dataPin, OUTPUT);

	// start Serial
	Serial.begin(9600);

	//Binary notation as comment
	dataArray[0] = 0xFF; //0b11111111
	dataArray[1] = 0xFE; //0b11111110
	dataArray[2] = 0xFC; //0b11111100
	dataArray[3] = 0xF8; //0b11111000
	dataArray[4] = 0xF0; //0b11110000
	dataArray[5] = 0xE0; //0b11100000
	dataArray[6] = 0xC0; //0b11000000
	dataArray[7] = 0x80; //0b10000000
	dataArray[8] = 0x00; //0b00000000
	dataArray[9] = 0xE0; //0b11100000

	// function that blinks all the LEDs
    // gets passed the number of blinks and the 
	//  pause time
	blinkAll_2Bytes(2, 500);
}  //  end setup()

void loop()
{
	for (int j = 0; j < 10; j++)
	{
		// load the light sequence you want from array
		data = dataArray[j];
		// ground latchPin and hold low for as long as you 
		//  are transmitting
		digitalWrite(latchPin, LOW);
		// move 'em out
		shiftOut(dataPin, clockPin, data);
		// return the latch pin high to signal chip that it
		// no longer needs to listen for information
		digitalWrite(latchPin, HIGH);
		delay(300);
	}
}  //  end loop()



// the heart of the program
void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {
	// This shifts 8 bits out MSB first,
	//  on the rising edge of the clock,
	//  clock idles low

	// internal function setup
	int i = 0;
	int pinState;
	//pinMode(myClockPin, OUTPUT);
	//pinMode(myDataPin, OUTPUT);

	// clear everything out just in case to
	//  prepare shift register for bit shifting
	digitalWrite(myDataPin, 0);
	digitalWrite(myClockPin, 0);

	// for each bit in the byte myDataOut
	// NOTICE THAT WE ARE COUNTING DOWN in our for loop
	// This means that %00000001 or "1" will go through such
	//  that it will be pin Q0 that lights.
	for (i = 7; i >= 0; i--)
	{
		digitalWrite(myClockPin, 0);

		//if the value passed to myDataOut and a bitmask result
		// true then... so if we are at i=6 and our value is
		// %11010100 it would the code compares it to %01000000
		// and proceeds to set pinState to 1.
		if (myDataOut & (1 << i))
		{
			pinState = 1;
		}
		else 
		{
			pinState = 0;
		}

		//Sets the pin to HIGH or LOW depending on pinState
		digitalWrite(myDataPin, pinState);
		//register shifts bits on upstroke of clock pin  
		digitalWrite(myClockPin, 1);
		//zero the data pin after shift to prevent bleed through
		digitalWrite(myDataPin, 0);
	}

	//stop shifting
	digitalWrite(myClockPin, 0);
}  //  end shiftOut()


//blinks the whole register based on the number of times you want to
//blink "n" and the pause between them "d"
//starts with a moment of darkness to make sure the first blink
//has its full visual effect.
void blinkAll_2Bytes(int n, int d)
{
	digitalWrite(latchPin, 0);
	shiftOut(dataPin, clockPin, 0);
	shiftOut(dataPin, clockPin, 0);
	digitalWrite(latchPin, 1);
	delay(200);
	for (int x = 0; x < n; x++)
	{
		digitalWrite(latchPin, 0);
		shiftOut(dataPin, clockPin, 255);
		//shiftOut(dataPin, clockPin, 255);
		digitalWrite(latchPin, 1);
		delay(d);
		digitalWrite(latchPin, 0);
		//shiftOut(dataPin, clockPin, 0);
		shiftOut(dataPin, clockPin, 0);
		digitalWrite(latchPin, 1);
		delay(d);
	}
}  //  end blinkAll_2Bytes()

I am okay with this until I get to line 98
if (myDataOut & (1 << i)) {

What is happening here?
How does myDataOut & (1 << i) work as a Boolean conditional?

Thanks

It’s the same as

byte b = 3;
if(b)
{
}

OR

if(Serial.available())
{
}

If the value is 0, it evaluates to false, else it evaluates to true.

I prefer to write it out
e.g.

if(Serial.avalaible() > 0)
{
}

Or for your example

if((myDataOut & (1 << i)) == (1 << i))
{
}

Anything that is not zero is defined as true. So what you're doing is masking out everything except that one bit. If that one bit is set in myDataOut, the result of the logical & operation is that one bit. Which is not zero, so it is true. If that one bit is not set in myDataOut, then the result of the logical & operation is 0, which is false.

Ah Ha! The penny drops.

Thanks folks