Com array é menos eficiente... algo como:
#define P0 0x1
#define P1 0x2
#define P2 0x4
#define P3 0x8
//completa o resto
void expanderBitWrite( unsigned char bit, unsigned char value) {
unsigned char status = expanderRead(); //deve haver uma destas funcões para ler o estado do registo
if (value == HIGH) expanderWrite(status | bit);
else expanderWrite(status &~(bit));
}