私はDWORD
、例えば:を持っています0x0A0B0C0D
。入手したい0x0D0C0B0A
。
私は通常、BSWAP
アセンブリ命令を使用しますが、組み込みのアセンブリをサポートしていないコンパイラを使用しています。
私はDWORD
、例えば:を持っています0x0A0B0C0D
。入手したい0x0D0C0B0A
。
私は通常、BSWAP
アセンブリ命令を使用しますが、組み込みのアセンブリをサポートしていないコンパイラを使用しています。
そして、このコンパイラは何ですか?最近のほとんどのまともなコンパイラはbswap組み込みをサポートしており、GCCにはここにいくつかのソリューション、またはプレーンな組み込みリストがあります。
MSVCには_byteswap_*
RTL (組み込み形式に最適化されます)があり、ICCには_bswap*
組み込みが含まれています。
htonl
たとえば、自分自身を少しいじりたくない場合に使用できます。
new_dword = (dword & 0x000000ff) << 24 | (dword & 0x0000ff00) << 8 |
(dword & 0x00ff0000) >> 8 | (dword & 0xff000000) >> 24;
http://www.cplusplus.com/forum/beginner/2563/
ビットを手動で並べ替えるルーチンについて考えてみます。
これは、他の方法と比較して最大限に遅いことがほぼ保証されており、ニーズに合わない場合があります。
#include <iostream>
#include <limits.h>
unsigned int rearrange(unsigned int val);
int main() {
unsigned int a = 0xa0b0c0d0;
std::cout << std::hex << std::showbase
<< a << '\n'
<< rearrange(a) << std::endl;
}
unsigned int rearrange(unsigned int val) {
return (val & 0xff000000) >> CHAR_BIT * 3 |
(val & 0x00ff0000) >> CHAR_BIT |
(val & 0x0000ff00) << CHAR_BIT |
(val & 0x000000ff) << CHAR_BIT * 3;
}
出力
0xa0b0c0d0
0xd0c0b0a0