Если я хорошо понимаю горизонталь A с пикселями от 126, 17, 17, 17, 126:
01111110
00010001
00010001
00010001
01111110
должен произвести вертикальное вращение A влево (пропущено 0 здесь нет):
01110
10001
10001
10001
11111
10001
10001
00000
Это означает: (верхняя цифра - это индекс в массиве, а нижний битовый ранг)
07 06 05 04 03 02 01 00
17 16 15 14 13 12 11 10
27 26 25 24 23 22 21 20
...
n7 n6 n5 n4 n3 n2 n1 n0
должны составить
00 10 20 30 .. n0
01 11 21 31 .. n1
02 12 22 32 .. n2
...
07 17 27 37 .. n7
Предложение осделать это:
#include <stdio.h>
#include <string.h>
void turnLeft(const unsigned char * v, unsigned char r[8], size_t sz)
{
memset(r, 0, sizeof(r));
size_t j = 0;
for (unsigned m = 1; m != (1 << 8); m <<= 1) {
for (size_t i = 0; (i != sz) && (i != 8); ++i) {
if (v[i] & m)
r[j] |= (1 << (7 - i));
}
j += 1;
}
}
void pr(const unsigned char * v, size_t sz)
{
for (size_t i = 0; i != sz; ++i) {
unsigned char c = v[i];
for (unsigned m = (1 << 7); m != 0; m >>= 1)
putchar('0' + ((c & m) != 0));
putchar('\n');
}
}
int main()
{
const unsigned char v[] = { 126, 17, 17, 17, 126 };
unsigned char r[8];
pr(v, sizeof(v));
putchar('\n');
turnLeft(v, r, sizeof(v));
pr(r, 8);
}
Компиляция и выполнение:
vxl15036 /tmp % gcc -std=c99 -pedantic -Wextra a.c
vxl15036 /tmp % ./a.out
01111110
00010001
00010001
00010001
01111110
01110000
10001000
10001000
10001000
11111000
10001000
10001000
00000000