2012-06-04 79 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 
}; 

其一般不建議這樣定義他們,因爲他們是不可移植。這裏的其他答案顯示了一個更便攜的方式來做到這一點。

相關問題