0
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;

このコードは正しいですか?

ありがとう

4

7 に答える 7

2

ビットを下にシフトする必要があります。

w= (wxyz & 0xFF800000) >> 23;
x= (wxyz & 0x007FC000) >> 14;
y= (wxyz & 0x00003F00) >> 8;
z= (wxyz & 0x000000FC) >> 2;
于 2011-01-17T21:28:20.823 に答える
1

4バイトのintから最上位バイトを取得するには、次の手順を実行する必要がありますw = (wxyz & 0xFF000000) >> 24。最初にビットマスクを適用してから、ビットを最下位バイトにシフトします。

または、他の方法でそれを行うことができます-シフト、ビットマスクを適用します:

w = (wxyz >> 24) & 0xFF
x = (wxyz >> 16) & 0xFF
y = (wxyz >> 8) & 0xFF
z = wxyz & 0xFF

しかし、ユニオンを使用する方が簡単ではありませんか?

于 2011-01-17T21:29:26.703 に答える
1
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);
于 2011-01-17T21:37:44.813 に答える
0

ちょっと待ってください-ビット0〜8とはどういう意味ですか?これは通常、最下位9ビットを意味します。この場合、intの間違った端を把握しています。

于 2011-01-17T21:42:27.810 に答える
0

これは、「インチング」によってこれを処理することを好む方法です。それは私の頭の中でより理にかなっています。また、マスクしてからシフトするのとは異なり、 >> が符号拡張されるという問題はありません (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 タイプの調整は、読者の演習として残されています。

于 2011-01-17T21:48:44.480 に答える
0

使用できる別のソリューションを次に示します。

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;
于 2011-01-18T02:21:50.140 に答える
-1

部分的に正しい。各セグメントの値が必要な場合は、それらを右にシフトする必要があります。

short w = (short)((wxyz & 0xFF800000) >> 23);
short x = (short)((wxyz & 0x007FC000) >> 14);
short y = (short)((wxyz & 0x00003F00) >> 8);
short z = (short)((wxyz & 0x000000FC) >> 2);

これらは正しい値です。

于 2011-01-17T21:39:51.067 に答える