如何在c#中复制Delphi的交换函数

时间:2014-06-16 03:14:36

标签: c# bitwise-operators

我正在尝试在C#中编写一个交换函数来模仿Delphi中的交换函数。根据文档,Delphi中的文档将执行以下操作:

  • 如果数字是两个字节,则交换字节1和2
  • 如果数字是4个字节,则交换字节1和4,字节2和3保持原样

以下是我的代码。

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

对大多数人来说,这可能是一个相当明显的错误,但我还没有处理过按位移位操作员,而且我似乎无法弄清楚我做错了什么。

提前致谢。

1 个答案:

答案 0 :(得分:3)

在C#中,数据类型shortint分别对应于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);
   }