Bitshifting bytes to form a long var fails!

This is the code:

void ReadData(long Start, long Stop) {
char result[3];
word counter = 0;
long address;
byte str5;

byte str1 = (Start & 0x0F);
byte str2 = (Start & 0xF0) >> 4;
byte str3 = (Start & 0xF00) >> 8;
byte str4 = (Start & 0xF000) >> 12;
if (Start & 0xF0000) {
str5 = (Start & 0xF0000) >> 16;
}
else {
str5 = 0x00;
}

for (byte a = str5; a <= 0x0F; a++) {
for (byte b = str4; b <= 0x0F; b++) {
for (byte c = str3; c <= 0x0F; c++) {
for (byte d = str2; d <= 0x0F; d++) {
for (byte e = str1; e <= 0x0F; e+=2) {
counter++;
address = long (a) << 16 | long (b) << 12 | c << 8 | d << 4 | e;
sprintf(result, "%04X",(char*) GetWord((long)address));
Serial.print(result);
if (counter == ((Stop - Start)/2)) goto out;
}
Serial.println();
}
}
}
}
out:
Serial.println();
return;
}

This code DOES NOT work!

The code that works is this:

void ReadData(long Start, long Stop) {
char result[3];
word counter = 0;
byte str5;

union ByteToLong addr;
byte str1 = (Start & 0x0F);
byte str2 = (Start & 0xF0) >> 4;
byte str3 = (Start & 0xF00) >> 8;
byte str4 = (Start & 0xF000) >> 12;
if (Start & 0xF0000) {
str5 = (Start & 0xF0000) >> 16;
}
else {
str5 = 0x00;
}

for (byte a = str5; a <= 0x0F; a++) {
for (byte b = str4; b <= 0x0F; b++) {
for (byte c = str3; c <= 0x0F; c++) {
for (byte d = str2; d <= 0x0F; d++) {
for (byte e = str1; e <= 0x0F; e+=2) {
counter++;
addr.nybble.a1 = e;
addr.nybble.a2 = d;
addr.nybble.b1 = c;
addr.nybble.b2 = b;
addr.nybble.c1 = a;
addr.nybble.c2 = 0x0;
addr.nybble.d1 = 0x0;
addr.nybble.d2 = 0x0; // /
sprintf(result, "%04X",(char
) GetWord(addr.whole);
Serial.print(result);
if (counter == ((Stop - Start)/2)) goto out;
}
Serial.println();
}
}
}
}
out:
Serial.println();
return;
}

I dont know why the first code doesnt work, i tried playing a bit with it but the second code did the job immediately!
If anyone has a simpler and/or faster solution, i will try it for sure!

cheers

P.S.:sorry for the long wait, i was out of town