Что делает | значит оператор в вызове функции? [C ++] - PullRequest
2 голосов
/ 13 мая 2009

Я обычно вижу это, когда смотрю код Win32. Я предполагаю, что это стандартный побитовый или, но я также иногда вижу его в C #, и кажется, что был бы лучший (намного более высокий уровень) способ сделать то же самое там. Во всяком случае, вот пример:

MessageBox(NULL, "Window Creation Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK);

Спасибо,

Симус

Ответы [ 6 ]

17 голосов
/ 13 мая 2009

| побитовое ИЛИ. MB_OK и MB_ICONEXCLAMATION - это определенные константы, которые имеют степень 2 (например, 32 или 128), так что побитовое ИЛИ может их объединять (128 | 32 будет равно 160, для которого установлены два бита). Это нормально, когда биты используются в качестве флагов.

12 голосов
/ 13 мая 2009

Это для маскировки. Давайте использовать этот невероятно тривиальный пример. У вас есть двоичное значение для цветов со следующими значениями.

100 = СИНИЙ

010 = КРАСНЫЙ

001 = ЗЕЛЕНЫЙ

Когда вы говорите SomeFunction (СИНИЙ | КРАСНЫЙ | ЗЕЛЕНЫЙ); вы фактически передаете значение 111, которое затем можно расшифровать, чтобы обозначить СИНИЙ, КРАСНЫЙ и ЗЕЛЕНЫЙ.

Побитовые операторы Google для более подробной информации.

5 голосов
/ 13 мая 2009

Это битовый оператор или оператор, как и в других местах. В основном, этот метод используется, когда вы хотите установить некоторые атрибуты, которые не являются взаимоисключающими.

Функция может легко проверить их с помощью следующего кода:

if (arg & MB_ICONEXCLAMATION) { // Show an exclamation icon...

}

// ...

if (arg & MB_OK) { // Show an OK button

}
2 голосов
/ 13 мая 2009

Думайте о MB_ICONEXCLAMATION и MB_OK как о «опциях», которые ничем не отличаются от целых. Что вас волнует, так это битовое представление этих целых.

Скажи:

//MessageBox.cs or whatever
public static int MB_ICONEXCLAMATION = 0x1 // 0001 in binary
public static int MB_OK = 0x2 // 0010 in binary

Когда вы ИЛИ их вместе, вы получаете 0011 в двоичном виде. Таким образом, вы запрашиваете обе опции для MessageBox, используя только один аргумент вместо того, чтобы иметь больше аргументов, по одному для каждой опции, которую вы хотите указать.

1 голос
/ 13 мая 2009

Это побитовое ИЛИ.

0 голосов
/ 13 мая 2009

Бит или.

int x = 5 | 3; // x == 7 сейчас

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...