2014-02-07 71 views
-2

我試圖交換前16位值的前8位和最後8位。例如,00000001 11001100變爲11001100 00000001;那麼我不知道如何實現它。我嘗試了不同的方式,但它不工作....任何幫助將不勝感激。對不起,如果這個問題很簡單。我剛開始學習點東西。感謝u.I有一個函數:交換16位值的前8位和後8位

unsigned short swap_bytes(unsigned short x) { 

} 
+5

它看起來並不像你試過* *任何方式:-( –

+0

http://msdn.microsoft.com/en-us /library/336xbhcz.aspx –

+0

的typedef工會迷你 { 無符號字符b [2]; 無符號短S; }微; – Manuel

回答

2
unsigned short swap_bytes(unsigned short x) { 
    unsigned short result; 
    result = (x >> 8) | (x << 8); 

    return result; 
} 

瓦爾特

+0

或者只是:'return(x >> 8)| (x << 8);' – lurker

+0

@mbratch是的,但我想說得更清楚。 –

2

假設值是恰好16位。

unsigned short swap_bytes(unsigned short x) 
{ 
    unsigned short bitmask = 0x00FF; 
    unsigned short temp = x & bitmask; 
    x = x >> 8; 
    temp = temp << 8; 
    x = x | temp; 
    return x; 
} 

工作原理:

  1. 位掩碼=設爲0x00FF使得掩碼與8前導零位,然後8和尾隨的1的值。
  2. temp = x &位屏蔽使臨時值爲8位前導零位,然後8位與x的最後8位相同。
  3. x = x >> 8將x的最左(最重要的)8位向右移位,用0替換它們。
  4. temp = temp < < 8將最右邊的8位溫度移到左邊,用0代替它們。
  5. x = x | temp將x的最後8位(它們是移位前x的前8位)和temp的前8位(它們是移位前x的最後8位)。
0
#include <bitset> 
using namespace std; 
int main() 
{ 
    typedef union{ 
     unsigned char arr[2]; 
     short s; 
    }SwapBit; 

    SwapBit sb; 
    sb.s = 100; 

    cout<<bitset<16>(sb.s)<<endl; 
    std::swap(sb.arr[0], sb.arr[1]); 

    cout<<bitset<16>(sb.s)<<endl; 
} 

結果是:

0000000001100100 
0110010000000000 
+0

OP的標籤顯示他在使用C而不是C++。 – lurker