编写方法ByteSwap但不按计划工作

时间:2012-02-03 02:06:23

标签: c# c++ c

所以我们需要编写一个方法

byteSwap - 交换第n个字节和第m个字节

  • 示例:byteSwap(0x12345678,1,3)= 0x56341278
  • byteSwap(0xDEADBEEF,0,2)= 0xDEEFBEAD
  • 您可以假设0 <= n <= 3,0 <= m <= 3
  • 法律视角:! 〜&amp; ^ | +&lt;&lt; &GT;&GT;

我们也不能使用循环/递归

但是我的以下代码在这个测试用例中失败了:

测试byteSwap(-2147483648 [0x80000000],0 [0x0],3 [0x3])失败... ......给出-128 [0xffffff80]。应该是128 [0x80]

不确定为什么虽然这是我的代码到目前为止

int byteSwap(int x, int n, int m) { 
int nBitShift = n << 3;  
int mBitShift = m << 3;
int nByte = x & (0xFF << nBitShift);  //gets the byte at position n
int mByte = x & (0XFF << mBitShift);  //gets the byte at position m 
int newX = x + ~(nByte + mByte) + 1; //make 0's in the nth and mth byte
nByte = nByte >> nBitShift; //shift back    
nByte = nByte << mBitShift; //shift to the mth spot
mByte = mByte >> mBitShift;  //shift back   
mByte = mByte << nBitShift; //shift to the nth spot

return nByte + mByte + newX;

}

编辑:是的,这是hw,但我需要帮助

3 个答案:

答案 0 :(得分:3)

有符号值的算术移位符号 - 扩展操作数。如果您将临时变量的类型切换为unsigned,则您的解决方案可以避免此问题。

答案 1 :(得分:1)

这将如何运作?

int byteswap(int x,int n,int m)
{
    unsigned char *x_bytes = (unsigned char*)&x, tmp = x_bytes[n];
    x_bytes[n] = x_bytes[m];
    x_bytes[m] = tmp;
    return x;
}

我知道这可能不是你的讲师/某人想到的,但这只是为了表达一个想法。如果有的话,它不使用循环也不使用递归。 ;)

答案 2 :(得分:0)

这是一个“发烧友”的解决方案。

unsigned int byteswap(const unsigned int x, unsigned int n, unsigned int m) {
    unsigned int mask;
    m <<= 3;
    n <<= 3;
    mask = ((x >> m) ^ (x >> n)) & 0xFFU;
    mask = (mask << m) | (mask << n);
    return (x ^ mask);
}