long wxyz; //(w = bits 0-8, x = bits 9-17 , y = bits 18-23, z = bits 24-29)
short w;
short x;
short y;
short z;
w= wxyz & 0xFF800000;
x= wxyz & 0x007FC000;
y= wxyz & 0x00003F00;
z= wxyz & 0x000000FC;
このコードは正しいですか?
ありがとう
long wxyz; //(w = bits 0-8, x = bits 9-17 , y = bits 18-23, z = bits 24-29)
short w;
short x;
short y;
short z;
w= wxyz & 0xFF800000;
x= wxyz & 0x007FC000;
y= wxyz & 0x00003F00;
z= wxyz & 0x000000FC;
このコードは正しいですか?
ありがとう
ビットを下にシフトする必要があります。
w= (wxyz & 0xFF800000) >> 23;
x= (wxyz & 0x007FC000) >> 14;
y= (wxyz & 0x00003F00) >> 8;
z= (wxyz & 0x000000FC) >> 2;
4バイトのintから最上位バイトを取得するには、次の手順を実行する必要がありますw = (wxyz & 0xFF000000) >> 24
。最初にビットマスクを適用してから、ビットを最下位バイトにシフトします。
または、他の方法でそれを行うことができます-シフト、ビットマスクを適用します:
w = (wxyz >> 24) & 0xFF
x = (wxyz >> 16) & 0xFF
y = (wxyz >> 8) & 0xFF
z = wxyz & 0xFF
しかし、ユニオンを使用する方が簡単ではありませんか?
w = wxyz & 0x000001ff;
x = (wxyz & 0x0003fe00) >> 9;
y = (wxyz & 0x00fc0000) >> 17;
z = (wxyz & 0x3f000000) >> 23;
編集:コンパイラの警告を避けるために、ロングからショートにキャストする必要があります:
w = (short) wxyz & 0x000001ff;
x = (short) ((wxyz & 0x0003fe00) >> 9);
y = (short) ((wxyz & 0x00fc0000) >> 17);
z = (short) ((wxyz & 0x3f000000) >> 23);
ちょっと待ってください-ビット0〜8とはどういう意味ですか?これは通常、最下位9ビットを意味します。この場合、intの間違った端を把握しています。
これは、「インチング」によってこれを処理することを好む方法です。それは私の頭の中でより理にかなっています。また、マスクしてからシフトするのとは異なり、 >> が符号拡張されるという問題はありません (C/C++ は、明確に定義された Java または C# ではありません)。質問に記載されているように、0 が MSB であると仮定します (そして、合計で 32 ビットありますが、longはそれ以上になる可能性があります)。
long wxyz = ...; //(w = bits 0-8, x = bits 9-17 , y = bits 18-23, z = bits 24-29)
wxyz >>= 2; // discard 30-31 (or, really, "least two insignificant")
z = wzyz & 0x3f; // easy to see this is "6 bits", no?
wzyz >>= 6; // throw them out
y = wzyz & 0x3f;
wzyz >>= 6;
x = wzyz & 0x1ff;
wzyz >>= 9;
w = wzyz & 0x1ff;
wzyz >>= 9; // for fun, but nothing consumes after
PS タイプの調整は、読者の演習として残されています。
使用できる別のソリューションを次に示します。
long wxyz;
short w, x, y, z;
char* buf = new char[sizeof(long)];
buf = (char*)long; // cast long as byte array
w = (short)buf[0]; // The way you sort depends on endianness
x = (short)buf[1];
y = (short)buf[2];
z = (short)buf[3];
delete[] buf;
部分的に正しい。各セグメントの値が必要な場合は、それらを右にシフトする必要があります。
short w = (short)((wxyz & 0xFF800000) >> 23);
short x = (short)((wxyz & 0x007FC000) >> 14);
short y = (short)((wxyz & 0x00003F00) >> 8);
short z = (short)((wxyz & 0x000000FC) >> 2);
これらは正しい値です。