c# - 在 C# 中用 32 位字交换字节序的更快方法

标签 c# bit-manipulation endianness

this question ,以下代码:

public static void Swap(byte[] data)
{
        for (int i = 0; i < data.Length; i += 2)
        {
                byte b = data[i];
                data[i] = data[i + 1];
                data[i + 1] = b;
        }
}

用不安全的代码重写以提高其性能:

public static unsafe void SwapX2(Byte[] Source)  
{  
    fixed (Byte* pSource = &Source[0])  
    {  
        Byte* bp = pSource;  
        Byte* bp_stop = bp + Source.Length;  

        while (bp < bp_stop)  
        {
            *(UInt16*)bp = (UInt16)(*bp << 8 | *(bp + 1));  
            bp += 2;  
        }  
    }  
}

假设有人想用 32 位字做同样的事情:

public static void SwapX4(byte[] data)
{
    byte temp;
    for (int i = 0; i < data.Length; i += 4)
    {
        temp = data[i];
        data[i] = data[i + 3];
        data[i + 3] = temp;
        temp = data[i + 1];
        data[i + 1] = data[i + 2];
        data[i + 2] = temp;
    }
}

这将如何以类似的方式重写?

最佳答案

public static unsafe void SwapX4(Byte[] Source)  
{  
    fixed (Byte* pSource = &Source[0])  
    {  
        Byte* bp = pSource;  
        Byte* bp_stop = bp + Source.Length;  

        while (bp < bp_stop)  
        {
            *(UInt32*)bp = (UInt32)(
                (*bp       << 24) |
                (*(bp + 1) << 16) |
                (*(bp + 2) <<  8) |
                (*(bp + 3)      ));
            bp += 4;  
        }  
    }  
}

请注意,这两个函数(我的 SwapX4 和你的 SwapX2)只会交换小端主机上的任何内容;当在大端主机上运行时,它们是昂贵的空操作。

关于c# - 在 C# 中用 32 位字交换字节序的更快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11660127/

相关文章:

c# - 旋转时固体物体的持续角

java - java位移位是循环的吗?

c - 指针转换后指针算术如何工作?

python - 在 Python 3 中返回整数中最低有效位集的位置的最快方法是什么?

c++ - 为什么在将 short[] 转换为 char* 时数组会反转?

c++ - 将 16 位整数复制到两字节数组

c# - 如何使用 C# 中的 Youtube API 将视频上传到 YouTube?

c# - 如何防止将 Windows-1252 参数转换为 Unicode 字符串?

C#避免为接口(interface)属性重复代码

algorithm - 位掩码技术