2012-06-04 47 views
0

我的问题的标题不能很准确,因为我不知道如何真正调用这个东西。我一直在看Win32 API如何在一个变量中存储更多的1值。例如,WPARAMLPARAM。它是一个long数字,它被“分成”两个:高位字和低位字。 还有更多的例子,它需要32位值,将其分为2,并将其设置为两个16位值。在一个变量中存储多个值

如何以这种方式设置变量? (创建一个变量,并将这些位分成我需要的数量,并设置每个部分)

P.S.我主要是为了教育目的而问,所以即使你不会推荐我自己做这件事,我仍然会感激你的答案。 谢谢。

+0

看看[这个SO问题](http://stackoverflow.com/questions/2515261/what-are-the-definitions-for-lparam-and-wparam)。一旦你清理你的困惑,你可以重新制定你的问题:) –

+0

@AlexanderPavlov谢谢你的建设性意见。我会看看。 – MasterMastic

+2

请注意,以这种方式引入错误更容易,尤其是如果您不熟悉位操作,并且现代PC有足够的内存不再需要此功能。除了他们运行Eclipse之外:) IMO更清晰的代码赢得大部分时间,除非你运行了一个分析器,并且*是你的性能瓶颈。 – Torp

回答

1

有(至少)两个来实现这个方法:

  • 使用位移位吨/掩模运营商<<>>&|,是这样的(只是一个例子,未测试):

    int loWord = ...; 
    int hiWord = ...; 
    LPARAM param = (hiWord << 16) | loWord; 
    ... 
    loWord = param & 0xFFFF; 
    hiWord = param >> 16; 
    
  • 使用union类型(尽管这后一种是受存储器对准和排列顺序问题,所以它可能不是一个便携式解决方案); see an example here

+1

'union'只能保存一个值 – Pubby

+0

@Pubby,它可以是一个结构本身,包含几个字段;看到链接的例子。 –

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

或者你可以使用WinDef.h定义为LOBYTEHIBYTE宏:

BYTE lowByte = LOBYTE(param); 
BYTE hiByte = HIBYTE(param); 
+0

我可能会问太多,但是你可以在这里引用一个引用,所以我可以了解这段代码的真实含义吗?我试图阅读按位运算符指南和教程,但没有一本教导实际用途。 – MasterMastic

1

它通常被称为一个位掩码,并定义它们可能是如下的一种方法:

struct Param 
{ 
    unsigned wparam : 16;  //16 bits 
    unsigned lparam : 16;  //16 bits 
}; 

其一般不建议这样定义他们,因为他们是不可移植。这里的其他答案显示了一个更便携的方式来做到这一点。

相关问题