Sí, se me ha ocurrido algo.
Mediante desplazamiento de bits y AND puedes sacar uno a uno los bits de cada carácter.
Por otra parte hay 4 formas diferentes de rellenar los rectángulos con esos bits, por tanto prepararía 4 funciones diferentes que recibieran los siguientes argumentos: posición X, dentro de QR de su primer bit; posición Y, dentro de QR de su primer bit; carácter que debe codificar. La función retornará la posición X e Y calculada después de que este 'cursor' salga del recuadro (que será usado por la siguiente función para escribir el siguiente carácter).
Ejemplo de uso de esas funciones, la implementación te la dejo para tí:
int x = 20;
int y = 14;
up(&x, &y, 'P'); // Se rellena desde abajo hacia arriba
frombottom(&x, &y, 'E); // Se rellena hacia la izquierda desde abajo
down(&x, &y, 'G'); // Se rellena desde arriba hacia abajo
down(&x, &y, 'A');
// ...
Dentro de cada función, mediante AND y desplazamientos a la derecha >> puedes sacar cada bit para saber en esa posición del QR hay un 1 o un 0.
Como todas las funciones son parecidas, solo cambia el patrón de movimiento, puedes hacerlo todo en una única función y que el patrón se de como un argumento más. Por ejemplo:
void writedata(int *x, int *y, char *c, PATH p);
Siendo PATH un enum con los cuatro caminos diferentes que pueden tomar los datos.