2012-02-21 113 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

的「帽子戲法」的方式做,這是預先計算與比特字節的翻轉表。然後,您可以使用數組中的一個字節來索引表並將其寫回。正如其他人所說 - 在這裏你的字節有多少位?