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;

编辑:需要将 long 转换为 short 以避免编译器警告:

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

这是我更喜欢通过“寸动”来处理这个问题的方式。这在我的脑海中更有意义。此外,与掩码和移位不同, >> 没有符号扩展的问题(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

等等——0-8 位是什么意思?这通常意味着九个最低有效位,在这种情况下,您掌握了 int 的错误结尾。

于 2011-01-17T21:42:27.810 回答
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 回答