Незнакомые операторы ">>" и "&" в примерах из справки. Что это?

 

Здравствуйте. Пытаюсь использовать код из справки в своем индикаторе.
Ниже вставлю полный фрагмент кода, который меня смутил и в котором не могу разобраться.

Меня смутила строка. Не понимаю, что такое ">>". Как эта штука ">>" называется и что она означает?

int flg_keys = (int)(lparam>>32);


И дальше везде используется вот такая штука "&". Подскажите пожалуйста, что это? Не встречал этот оператор в выражениях типа "if". Как его правильно читать?

if((flg_keys&0x0001)!=0)


Подскажите пожалуйста, что это за звери такие? Благодарю за ответы!

//+------------------------------------------------------------------+ 
//| ChartEvent function                                              | 
//+------------------------------------------------------------------+ 
void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam) 
  { 
   if(id==CHARTEVENT_MOUSE_WHEEL) 
     { 
      //--- разберем состояние кнопок и колесика мышки для этого события  
      int flg_keys = (int)(lparam>>32);          // флаг состояний клавиш Ctrl, Shift и кнопок мышки 
      int x_cursor = (int)(short)lparam;         // X-координата, в которой произошло событие колесика мышки 
      int y_cursor = (int)(short)(lparam>>16);   // Y-координата, в которой произошло событие колесика мышки 
      int delta    = (int)dparam;                // суммарное значение прокрутки колесика, срабатывает при достижении +120 или -120 
      //--- обработаем флаг  
      string str_keys=""; 
      if((flg_keys&0x0001)!=0)  
         str_keys+="LMOUSE "; 
      if((flg_keys&0x0002)!=0)  
         str_keys+="RMOUSE "; 
      if((flg_keys&0x0004)!=0)  
         str_keys+="SHIFT "; 
      if((flg_keys&0x0008)!=0)  
         str_keys+="CTRL "; 
      if((flg_keys&0x0010)!=0)  
         str_keys+="MMOUSE "; 
      if((flg_keys&0x0020)!=0)  
         str_keys+="X1MOUSE "; 
      if((flg_keys&0x0040)!=0)  
         str_keys+="X2MOUSE "; 
       
      if(str_keys!="") 
         str_keys=", keys='"+StringSubstr(str_keys,0,StringLen(str_keys)-1) + "'"; 
      PrintFormat("%s: X=%d, Y=%d, delta=%d%s",EnumToString(CHARTEVENT_MOUSE_WHEEL),x_cursor,y_cursor,delta,str_keys); 
     } 
  } 
//+------------------------------------------------------------------+ /* 
   Пример вывода 
   CHARTEVENT_MOUSE_WHEEL: Ctrl pressed: X=193, Y=445, delta=-120 
   CHARTEVENT_MOUSE_WHEEL: Shift pressed: X=186, Y=446, delta=120 
   CHARTEVENT_MOUSE_WHEEL:  X=178, Y=447, delta=-120 
   CHARTEVENT_MOUSE_WHEEL:  X=231, Y=449, delta=120 
   CHARTEVENT_MOUSE_WHEEL: MiddleButton pressed: X=231, Y=449, delta=120 
   CHARTEVENT_MOUSE_WHEEL: LeftButton pressed: X=279, Y=320, delta=-120 
   CHARTEVENT_MOUSE_WHEEL: RightButton pressed: X=253, Y=330, delta=120  */
 

>> - операция побитового сдвига вправо. Эквивалентна делению на 2 без остатка. Таким образом, этот код:

lparam>>32

побитово сдвигает значение lparams вправо 32 раза или делит его на 2^32. Этим приемом получают старшие 32 бита lparams.


& - операция побитового И. Выполняет операцию И с соответствующими битами (нулевой с нулевым, первый с первым и т. д.) двух значений, т. е. если хотя бы в одном из битов 0, то результирующий бит будет 0. Таким образом, код:

if((flg_keys&0x0001)!=0)

проверяет нулевой бит flg_keys. Он должен быть установлен в 1. Иначе условие будет false.

Этим приемом проверяется значение каждого из нужных битов. Хотя в данном примере можно было не производить первичный сдвиг и напрямую проверить биты. Но тогда страдает наглядность кода.

 
Ihor Herasko #:

>> - операция побитового сдвига вправо. Эквивалентна делению на 2 без остатка. Таким образом, этот код:

побитово сдвигает значение lparams вправо 32 раза или делит его на 2^32. Этим приемом получают старшие 32 бита lparams.


& - операция побитового И. Выполняет операцию И с соответствующими битами (нулевой с нулевым, первый с первым и т. д.) двух значений, т. е. если хотя бы в одном из битов 0, то результирующий бит будет 0. Таким образом, код:

проверяет нулевой бит flg_keys. Он должен быть установлен в 1. Иначе условие будет false.

Этим приемом проверяется значение каждого из нужных битов. Хотя в данном примере можно было не производить первичный сдвиг и напрямую проверить биты. Но тогда страдает наглядность кода.

Ого. Ничего себе. Спасибо за подробный ответ. Буду разбираться.

 
yar.forex #:

Ого. Ничего себе. Спасибо за подробный ответ. Буду разбираться.

Всё в доке присутствует.