2012-02-21 62 views
2

我是位操作的新手。 我的朋友最近在采访中问我这个。 给定一个字节数组 例如: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; 
} 

但我不知道如何才能扭转两位有效地就地。 在此先感谢。

+1

你是怎么得到'1000 | 0101'?你不在那里有一个错字吗? – LihO 2012-02-21 19:27:34

+1

您给定的字节数组似乎是(16位| 12位),总共为28位,或者不是整数个字节。这也意味着你的|不在中间。请澄清。 – abelenky 2012-02-21 19:28:45

+0

为什么不一次只做8个? – 2012-02-21 19:31:30

回答

2

我只是在做一次全字节(或更多):

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

的“帽子戏法”的方式做,这是预先计算与比特字节的翻转表。然后,您可以使用数组中的一个字节来索引表并将其写回。正如其他人所说 - 在这里你的字节有多少位?