Реверсирование двух битов за раз в массиве - PullRequest
2 голосов
/ 21 февраля 2012

Я новичок в битовых манипуляциях.Мой друг недавно спросил меня об этом в интервью.Дан массив байтов, например: 1000100101010101 |001010011100 Нам нужно перевернуть два бита за раз по горизонтали.Таким образом, новый массив должен быть: 1000 |0101 и т. Д.

и т. Д.Я думаю, что мы начинаем с середины (отмеченной здесь) и продолжаем наш путь, взяв два бита за раз.Я знаю, как инвертировать отдельные биты в числе в одно и то же время:

unsigned int reverse(unsigned int num)
{
    unsigned int  x = sizeof(num) * 8;
    unsigned int reverse_num = 0, i, temp;

    for (i = 0; i < x; i++)
    {
        temp = (num & (1 << i));
        if(temp)
            reverse_num |= (1 << ((x - 1) - i));
    }

    return reverse_num;
}

Но мне интересно, как мы можем эффективно инвертировать два бита на месте.Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 21 февраля 2012

Я бы просто сделал целый байт (или больше) сразу:

output = (input & 0x55) << 1;
output |= (input & 0xAA) >> 1;
0 голосов
/ 22 февраля 2012

Способ "хитрости" для этого состоит в том, чтобы предварительно вычислить таблицу байтов с перевернутыми битами.Затем вы можете просто проиндексировать таблицу, используя байт из массива, и записать ее обратно.Как уже говорили другие - сколько битов в ваших байтах здесь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...