2013-06-28 3 views
1

Я использовал двойную вертикальную "||" как логический оператор «или». И увидел, что «|» является поразрядным или.Какова точная функция функции "|" (вертикальная линия) при разделении аргументов

Однако, поскольку я начал работать с C++/cli, я заметил, что он используется для разделения флагов в функциях с единственным параметром, который, кажется, принимает несколько флагов.

Примером этого может служить пример функции msdn для функции MessageBox().

int msgboxID = MessageBox(
     NULL, 
     (LPCWSTR)L"Resource not available\nDo you want to try again?", 
     (LPCWSTR)L"Account Details", 
     MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2 
    ); 

Что такое операция, выполняемая командой "|" Вот?

Что такое «|» символ на самом деле называется? (Как и «^», называется кареткой, а не тем, что я знал по-прежнему, как я запрограммировал, что было «вверх ногами V»): D

Причина, по которой я спрашиваю, что я использую функцию setWindowPos (), который также принимает флаги в качестве параметров. Функция объявлена ​​следующим образом:

BOOL WINAPI SetWindowPos(
    _In_  HWND hWnd, 
    _In_opt_ HWND hWndInsertAfter, 
    _In_  int X, 
    _In_  int Y, 
    _In_  int cx, 
    _In_  int cy, 
    _In_  UINT uFlags 
); 

И я хотел бы знать, являются ли флаги могут быть объединены таким же образом, как и в MessageBox().

Спасибо заранее,

Guy

+0

Это логично или оперативно. –

+3

@TioPepe Нет, это не так, это _bitwise_ или оператор! – zennehoy

+0

Мое предположение - 'MB_ICONWARNING',' MB_CANCELTRYCONTINUE', 'MB_DEFBUTTON2' - это макросы, определенные где-то в коде, и' | 'является побитовым или оператором, применяемым к ним. –

ответ

4

| является оператором bitwise or. Он используется так, как вы описываете, когда несколько значений можно комбинировать для создания разных эффектов. Например:

unsigned char MB_ICONWARNING = 1; //00000001 
unsigned char MB_CANCELTRYCONTINUE = (1 << 1); //00000010 
unsigned char MB_DEFBUTTON2 = (1 << 2); //00000100 

Допустим, вы хотите окно сообщения с этим имеет все свойства, представленные этими значениями, можно указать, что bitwise or «ИНГ их:

unsigned char combined = MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2; //00000111 

вызываемая функция может затем использовать их для определения параметров, которые вы запросили с оператором bitwise & как этот

if(options & MB_ICONWARNING) 
{ 
    //Do MB_ICONWARNING 
} 

if(options & MB_CANCELTRYCONTINUE) 
{ 
    //Do MB_CANCELTRYCONTINUE 
} 

//etc... 

Если вы заинтересованы, вы можете прочитать на Bit Fields.

+0

Хорошо, спасибо, я понимаю сейчас.Я просто предположил, что это не будет другое «или», потому что, если я скажу, что я на самом деле делаю здесь в моей голове, я, естественно, вербализую это как «и». «Флаги, которые я собираюсь установить, - MB_ICONWARNING и MB_CANCELTRYCONTINUE и MB_DEFBUTTON2». Только одна из тех вещей, которые я нашел сбивчивой. Как упоминалось в комментарии к вышеуказанному ответу, очевидно, наивные программисты используют + вместо этого. Я думаю, это потому, что это кажется более естественным. В любом случае, спасибо. –

+0

Да, дело в том, что + будет вас взорвать, если ваше одно из ваших битовых значений больше, чем немного больше, и перейдет к другому. Рад, что смог помочь! –

5
unsigned int flag = MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2 

Здесь | еще побитовое или оператор. Разделяемые аргументы - это макросы некоторых бит-паттеров. Они, вероятно, определяется следующим образом:

#define MB_ICONWARNING  1 
#define MB_CANCELTRYCONTINUE 2 
#define MB_DEFBUTTON2  4 

Так что внутри функции MessageBox, параметры могут быть проверены, как это проверить, если MB_ICONWARNING бит включен.

if (flag & MB_ICONWARNING) 
3

Пока флаги могут быть однозначно определены их битами (например, будучи полномочия двух), то они могут быть объединены с помощью побитового или оператора, как вы пытаетесь сделать.

Рассмотрим:

MB_ICONWARNING = 1; 
MB_CANCELTRYCONTINUE = 2; 

затем

flags = MB_ICONWARNING | MB_CANCELTRYCONTINUE; // == 3 

Для проверки против флагов, то вы можете использовать побитовое и:

if(flags & MB_ICONWARNING) { ... } 
+1

'Пока флаги определены как один бит каждый. Нет, это не так, они не должны содержать только один бит. –

+1

Фактически флаги не должны быть мощью двух, и они могут содержать более 1 бит – Enigma

+0

@LieRyan True, измененная формулировка, чтобы отразить это. – zennehoy

2

Символ называется одно из следующих действий: вертикальный -bar, vbar, вертикальная линия или вертикальная косая черта:

http://www.theasciicode.com.ar/ascii-printable-characters/vertical-bar-vbar-vertical-line-vertical-slash-ascii-code-124.html

Он выполняет побитовое ИЛИ:

http://en.wikipedia.org/wiki/Bitwise_operation

+0

Спасибо! Всегда помогает знать правильные имена, чтобы упростить разрешение таких запросов :) –

1

Если вы будете смотреть here на шаблон, который все эти ошибки (я имею в виду их представление значения) вы заметите, что есть много s поровну их ИЛИ.Каждая группа флагов резервирует 4-битный блок в зависимости от конкретного флага, значения которого изменяются.

Комбинации блокируются таким образом, чтобы побитовое ИЛИ могло работать как оператор +.

MB_ICONWARNING ............... 0x00000030L

MB_DEFBUTTON2 ................ 0x00000100L

MB_CANCELTRYCONTINUE. 0x00000006L

Побитовое ИЛИ результат ................... 0x00000136L

В качестве 3-го параметра из MessageBox стендов для

Содержание и поведение диалогового окна.

Теперь компилятор может легко проверить соответствие поразрядного результата для отображения.