Bitshifting bytes to form a long var fails!

The task at hand is interlacing nibbles, more specifically 'un-serialisation' of data.

To help you see it more explicitly:

#define n2uc(high_nibble, low_nibble)  (((high_nibble) & 0xf0) | ((low_nibble) & 0x0f))

...
  uc_ptr = (unsigned char *) &address;
  *uc_ptr++ = n2uc(d, e);
  *uc_ptr++ = n2uc(b, c);
  *uc_ptr   = n2uc(0, a);
  //done

You can find out which is faster.