所以我们需要编写一个方法
byteSwap - 交换第n个字节和第m个字节
我们也不能使用循环/递归
但是我的以下代码在这个测试用例中失败了:
测试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,但我需要帮助
答案 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);
}