在阵列中一次反转两位

时间:2012-02-21 19:24:15

标签: c bit-manipulation

我是位操纵的新手。 我的朋友最近在接受采访时问过我。 给定一个字节数组 例如:1000100101010101 | 001010011100 我们需要在水平位置一次翻转两位。 所以新数组应该是:                 1000 | 0101等等。

等等。 我想我们从中间开始(标记为| here)并继续向外两次取两个位。 我知道如何一次反转一个数字中的单个位:

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 个答案:

答案 0 :(得分:2)

我只是一次完成一个字节(或更多):

output = (input & 0x55) << 1;
output |= (input & 0xAA) >> 1;

答案 1 :(得分:0)

执行此操作的“技巧”方法是预先计算翻转位的字节表。然后,您可以使用数组中的一个字节对表进行索引,然后将其写回。正如其他人所说的那样 - 你的字节中有多少位?