我正在尝试在C#中编写一个交换函数来模仿Delphi中的交换函数。根据文档,Delphi中的文档将执行以下操作:
以下是我的代码。
int number = 17665024;
var hi = (byte)(number >> 24);
var lo = (byte)(number & 0xff);
return (number & 0x00FFFF00) + (lo & 0xFF000000) + (hi & 0x000000FF);
有些数字似乎会回归我所期望的,但大多数都没有。
// Value in // Expected // Actual
17665024 887809 887809
5376 21 5376
-30720 136 16746751
3328 13 3328
对大多数人来说,这可能是一个相当明显的错误,但我还没有处理过按位移位操作员,而且我似乎无法弄清楚我做错了什么。
提前致谢。
答案 0 :(得分:3)
在C#中,数据类型short
和int
分别对应于2字节和4字节的整数数据类型。上面的算法适用于int(4字节)。
此算法包含错误:(lo & 0xFF000000)
将始终返回0,因为lo
是一个字节。你可能想要的是lo << 24
,它将lo
24个字节向左移动。
对于int
数据类型,正确的函数将变为:
int SwapInt(int number)
{
var hi = (byte)(number >> 24);
var lo = (byte)(number & 0xff);
return ((number & 0xffff00) | (lo << 24) | hi);
}
对于short
数据类型,中间项消失,我们只剩下:
short SwapShort(short number)
{
var hi = (byte)(number >> 8);
var lo = (byte)(number & 0xff);
return (short)((lo << 8) | hi);
}
然后Swap((short)5376)
返回预期值21.注意Swap(5376)
将使用5376的默认int
数据类型,返回5376.要处理可以完全表示为两个的整数字节为short
,您可以运行:
int Swap(int n)
{
if (n >= Short.MinValue && n <= Short.MaxValue)
return SwapShort((short)n);
else
return SwapInt(n);
}