我对问题的标题不太准确,因为我不知道这件事是如何被称为的。
我一直在看Win32 API如何在变量中存储多于1个值。
例如,WPARAM
和LPARAM
。这是一个long
数字,被“划分”为两个:高字和低字。
当它需要32位值时,还有更多的例子,将它除以2并将其设置为两个16位值。
如何以这种方式设置变量? (创建一个变量,并将这些位除以我需要的数量,并设置每个部分)
P.S。我主要是为了教育目的而要求,所以即使你不建议我自己这样做,我仍然会欣赏答案。 感谢。
答案 0 :(得分:1)
你可以这样做:
WPARAM param = (WPARAM)(hiByte << 8 | lowByte);
设置变量param
的16位。
反向操作是这样的:
//BYTE is defined in WinDef.h
BYTE lowByte = (BYTE)(param && 0xFF);
BYTE hiByte = (BYTE)((param >> 8) && 0xFF);
或者您可以使用LOBYTE
中定义的宏HIBYTE
和WinDef.h
作为:
BYTE lowByte = LOBYTE(param);
BYTE hiByte = HIBYTE(param);
答案 1 :(得分:1)
有(至少)两种方法可以实现这一目标:
使用位移/掩码运算符<<
,>>
,&
和|
,就像这样(只是一个示例,未经过测试):< / p>
int loWord = ...;
int hiWord = ...;
LPARAM param = (hiWord << 16) | loWord;
...
loWord = param & 0xFFFF;
hiWord = param >> 16;
使用union
类型(虽然后者会受到内存对齐和字节序问题的影响,因此它可能不是一个可移植的解决方案); see an example here
答案 2 :(得分:1)
它通常称为位掩码,定义它们的一种方法可以如下:
struct Param
{
unsigned wparam : 16; //16 bits
unsigned lparam : 16; //16 bits
};
通常不建议以这种方式定义它们,因为它们不可移植。这里的其他答案显示了一种更便携的方式。