我正在用C#转换一个C ++应用程序,并且通过大部分工作来管理我的工作。但是我坚持以下声明:
#define GET_SHCALL_ID(L) (((L) >> 24) & 0x000000FF)
它由应用程序的另一部分调用,它接收一个Window消息并将lParam传递给此调用,如下所示:
// We perform and event handling to display state as required here..
LRESULT CShockSampleDlg::OnShockCallEvent(WPARAM wParam, LPARAM lParam)
{
// Pass events here so that they will be displayed int the m_LogMessages window.
OnDebugCallEvents(wParam, lParam);
UINT callID = GET_SHCALL_ID(lParam);
UINT chanID = GET_SHCHAN_ID(lParam);
UINT info = GET_SHCHAN_INFO(lParam);
所以我的问题是:
答案 0 :(得分:5)
考虑32位整数由4个八位字节(字节)组成:
zzyyxxww
0x12345678
该操作提取“zz”(0x12)字节。
但那只是实施。用法清楚地写在名称GET_SHCALL_ID中 - 得到 s来自{{b> sh ock 来电 ID 1}}。
C#和C ++共享许多运算符,在这种情况下函数是相同的。
lParam
答案 1 :(得分:1)
它取32位值的最高8位,例如0x12345678
变为0x12
。
通常情况下,lParam
会携带一些信息,这就是其中之一。看起来这就是冲击呼叫标识符,其他两个宏将从lParam
中获得不同的位用于其他目的(通道ID和通道信息)。
C#会是这样的:
uint lParam = 0x12345678; // for testing.
uint callID = (lParam >> 24) & 0xff;
uint chanID = ...; // These depend on where the
uint info = ...; // other bits are in lParam.
从技术上讲,这种情况下不需要& 0xff
,但如果lParam
碰巧是带符号的int(因为负号是符号扩展的)或大于32位的值(不太可能)。
答案 2 :(得分:0)
在C#中,这是相同的,但没有宏:
int result =(n>> 24)&为0xFF;
答案 3 :(得分:0)
这是将L的位值向右移位24位(我不知道LPARAM是什么/它有多长,所以我不能告诉你剩下的是什么),然后它是逐位的使用0xFF对该值进行AND运算,以便仅保留变量的剩余8位值。