交换2个字节的整数

时间:2014-01-26 02:05:56

标签: c byte swap byte-shifting

我有一个接收3个参数的方法:int x,int n和int m。它返回一个带有x swapped

的第n个和第m个字节的int

x只是一个普通的整数,设置为任何值。 n和m是0到3之间的整数。

例如,让x的十六进制表示为0x12345678,n为0,m为2。 应该切换最后一个和第三个到最后一个字节(n = 78,m = 34)。

我已经弄清楚如何从x中提取第n个和第m个字节,但我无法弄清楚如何将所有4个字节重新组合成该方法应该返回的整数。

这是我目前的代码: `

int byteSwap(int x, int n, int m)
{
    // Initialize variables which will hold nth and mth byte
    int xn = x;
    int xm = x;
    // If n is in bytes, n << 3 will be the number of bits in that byte
    // For example, if n is 2 (as in 2 bytes), n << 3 will be 16 (as in 16 bits)
    xn = x >> (n << 3);
    // Mask off everything except the part we want
    xn = xn & 0xFF;
    // Do the same for m
    xm = x >> (m << 3);
    xm = xm & 0xFF;
}

`

还有一些额外的限制 - 只允许以下内容:

~ & ^ | ! + << >>

(这意味着没有- * /,循环,if等等。但是,可以初始化其他变量,并且添加仍然可以。)

我的代码可以提取第n个和第m个字节,但我不知道如何在不使用ifs的情况下重新组合所有内容。

1 个答案:

答案 0 :(得分:1)

一些事情

您可以通过使用除了字节m和n之外的全部FF值屏蔽x来重新组合 您可以通过左移0xFF m次和n次计算掩码并合并结果然后将其与0xFFFFFFFF进行异或

int mask = 0;
int mask_m = 0xFF << (m << 3);
int mask_n = 0xFF << (n << 3);

mask = (mask_m | mask_n) ^ 0xFFFFFFFF;

int x_swapped = (x & mask) | (xm << (n <<3)) | (xn << (m <<3));
return x_swapped;

当您右移有符号值时,它可能会或可能不会将1而不是0传播到高位,并且是实现定义的。无论哪种方式,0xFF都可以防止这种情况发生。