交换前8位和最后8位16位值

时间:2014-02-07 04:20:10

标签: c bits

我试图交换16位值的前8位和后8位。例如,00000001 11001100变为11001100 00000001;好吧,我不知道如何实现它。我尝试了不同的方法,但它不起作用....任何帮助将不胜感激。对不起,这个问题很简单。我刚开始学习点东西。谢谢你。我有一个功能:

unsigned short swap_bytes(unsigned short x) {

}

3 个答案:

答案 0 :(得分:2)

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

    return result;
}

瓦尔特

答案 1 :(得分: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. bitmask = 0x00FF使位掩码为8前导零位,然后8位尾随1。
  2. temp = x&amp; bitmask使temp具有8个前导零位的值,然后8位与x的最后8位相同。
  3. x = x&gt;&gt; 8将x的最左边(最重要的)8位向右移动,用0替换它们。
  4. temp = temp&lt;&lt; 8将最右边的8位temp移到左边,用0替换它们。
  5. x = x | temp结合了x的最后8位(移位前x的前8位),前8位的temp(移位前是x的最后8位)。

答案 2 :(得分: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