C ++ Что делает этот простой макрос? - PullRequest
1 голос
/ 21 июля 2010

Я конвертирую приложение C ++ в C # и смогу справиться с большинством из них.Однако я застрял со следующим утверждением:

#define GET_SHCALL_ID(L)                           (((L) >> 24) & 0x000000FF)

Он вызывается другой частью приложения, которая получает сообщение окна и передает в этот вызов 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);

Итак, мои вопросы:

  • Что делает макрос / метод?
  • Что было бы эквивалентно в C #?

Ответы [ 4 ]

5 голосов
/ 21 июля 2010

Предположим, что 32-разрядное целое число состоит из 4 октетов (байтов):

  zzyyxxww
0x12345678

Эта операция извлекает байт "zz" (0x12).

Но это всего лишь реализация,Использование ясно написано в имени GET_SHCALL_ID - это получить s sh ock вызов ID от lParam.

C # и C ++ имеют много общих операторов, в этом случае функция точно такая же.

uint GET_SHCALL_ID(uint lParam) { return (lParam >> 24) & 0xFF; }
1 голос
/ 21 июля 2010

Требуются самые значимые 8 бит 32-битного значения, так что, например, 0x12345678 становится 0x12.

Как правило, lParam будет содержать несколько бит информации иэто становится одним из них.Похоже, что это идентификатор шокового вызова, и два других макроса получат разные биты из lParam для других целей (идентификатор канала и информация о канале).

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 бит (что маловероятно).

0 голосов
/ 21 июля 2010

Это битовое смещение битового значения L вправо на 24 бита (я не знаю, что такое LPARAM / как долго, поэтому я не могу сказать вам, что осталось), а затем оно побитовоеANDing значение с 0xFF, чтобы сохранить только оставшиеся 8-битные значения переменной.

0 голосов
/ 21 июля 2010

В C # это то же самое, но без макроса:

int result = (n >> 24) & 0xFF;

...