c0d*_*0da 3 c c++ endianness visual-studio
什么是反转16位和32位整数的字节顺序的最快方法.我经常做类似的事情(这个编码是在C++的Visual Studio中完成的):
union bytes4
{
__int32 value;
char ch[4];
};
union bytes2
{
__int16 value;
char ch[2];
};
__int16 changeEndianness16(__int16 val)
{
bytes2 temp;
temp.value=val;
char x= temp.ch[0];
temp.ch[0]=temp.ch[1];
temp.ch[1]=x;
return temp.value;
}
__int32 changeEndianness32(__int32 val)
{
bytes4 temp;
temp.value=val;
char x;
x= temp.ch[0];
temp.ch[0]=temp.ch[1];
temp.ch[1]=x;
x= temp.ch[2];
temp.ch[2]=temp.ch[3];
temp.ch[3]=x;
return temp.value;
}
Run Code Online (Sandbox Code Playgroud)
有没有更快的方法来做同样的事情,我不需要做那么多的计算?
为什么不使用内置swab函数,它可能比代码优化得更好?
除此之外,通常的位移操作应该很快开始,并且如此广泛使用,它们可能被优化器识别并被更好的代码所取代.
因为其他答案有严重错误,我会发布更好的实现:
int16_t changeEndianness16(int16_t val)
{
return (val << 8) | // left-shift always fills with zeros
((val >> 8) & 0x00ff); // right-shift sign-extends, so force to zero
}
Run Code Online (Sandbox Code Playgroud)
我测试的所有编译器都没有生成rolw此代码,我认为稍长的序列(就指令数而言)实际上更快.基准会很有趣.
对于32位,有几个可能的操作订单:
//version 1
int32_t changeEndianness32(int32_t val)
{
return (val << 24) |
((val << 8) & 0x00ff0000) |
((val >> 8) & 0x0000ff00) |
((val >> 24) & 0x000000ff);
}
//version 2, one less OR, but has data dependencies
int32_t changeEndianness32(int32_t val)
{
int32_t tmp = (val << 16) |
((val >> 16) & 0x00ffff);
return ((tmp >> 8) & 0x00ff00ff) | ((tmp & 0x00ff00ff) << 8);
}
Run Code Online (Sandbox Code Playgroud)
小智 5
至少在Visual C++中,您可以使用_byteswap_ulong()和朋友:http://msdn.microsoft.com/en-us/library/a3140177.aspx
这些函数被VC++编译器视为内在函数,并将导致生成的代码在可用时利用硬件支持.使用VC++ 10.0 SP1,我看到以下为x86生成的代码:
return _byteswap_ulong(val);
mov eax, DWORD PTR _val$[esp-4]
bswap eax
ret 0
return _byteswap_ushort(val);
mov ax, WORD PTR _val$[esp-4]
mov ch, al
mov cl, ah
mov ax, cx
ret 0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12598 次 |
| 最近记录: |