Подтвердить что ты не робот

Что означает это выражение в С#?

Что означает if ((a & b) == b) в следующем блоке кода?

if ((e.Modifiers & Keys.Shift) == Keys.Shift)
{
    lbl.Text += "\n" + "Shift was held down.";
}

Почему это не так?

if (e.Modifiers == Keys.Shift)
{
    lbl.Text += "\n" + "Shift was held down.";
}
4b9b3361

Ответ 1

Если вы посмотрите Keys enum, это flag enum с атрибутом [FlagsAttribute].

Используйте специальный атрибут FlagsAttribute для перечисления только в том случае, если поразрядная операция (AND, OR, EXCLUSIVE OR) должна выполняться с числовым значением.

Определите константы перечисления по степеням двух, то есть 1, 2, 4, 8 и т.д. Это означает, что отдельные флаги в комбинированных константах перечисления не перекрываются.

Итак, e.Modifiers может быть комбинацией более чем одного перечисления:

e.Modifiers = Keys.Shift | Keys.Cancel | Keys.Enter

Просто очень простое предположение, чтобы объяснить концепцию:

Keys.Shift  : 001 (1)
Keys.Cancel : 010 (2)
Keys.Enter  : 100 (4)

Итак:

e.Modifiers = Keys.Shift | Keys.Cancel | Keys.Enter equal 001 | 010 | 100 = 111

И условие:

    e.Modifiers & Keys.Shift equal 111 & 001 = 001

это означает:

 e.Modifiers & Keys.Shift == Keys.Shift

если e.Modifiers не содержит Keys.Shift:

e.Modifiers = Keys.Cancel | Keys.Enter (110)

Таким образом, результат будет:

e.Modifiers & Keys.Shift equals 110 & 001 = 000 (is not Keys.Shift)

Чтобы распаковать, это условие проверяет, содержит ли e.Modifiers Keys.Shift или не

Ответ 2

Эта логическая логика (& = "побитовая и" ). Вы проверяете, содержит ли переменная значение. Это как фильтр.

Пример:

a   -> 00110011
b   -> 00000011
a&b -> 00000011

В вашем коде

if ((e.Modifiers & Keys.Shift) == Keys.Shift)

который проверяет Keys.Shift, содержится в e.Modifiers.

Ответ 3

Один амперсанд относится к побитовому оператору И. При использовании в сочетании с перечислением, на котором есть атрибут [Flags], на котором выполняется перечисление Keys, оно используется, как вы показали, чтобы определить, установлен ли один из битов этого перечисления.

Одновременно может быть нажата более одной клавиши-модификатора, поэтому она используется вместо прямого сравнения.

Подробнее о флажках enum здесь. Прокрутите вниз до подраздела под названием "Типы перечислений в виде бит-флагов". Вы увидите образец, который очень похож на этот.

Ответ 4

Один амперсанд (&) является поразрядным И, поэтому он в основном добавляет значения (a и b), а затем тестирует равенство в (a и b) == b

Итак, в вашем примере, в основном, говорится, что нажата клавиша shift (любая клавиша + сдвиг) == shift.

Ответ 5

Используется побитовая операция для запроса, если установлен флаг (бит) (равный 1).

Вероятно, лучше всего читать на перечислениях и побитовых операциях в http://msdn.microsoft.com/en-us/library/vstudio/cc138362.aspx

Ответ 6

& - побитовый оператор И. То, что он делает, это Keys - это перечисление флага, значения в Keys могут быть поразрядными комбинациями из нескольких значений. Итак, чтобы проверить какое-либо конкретное значение, вы сначала И ваше значение со значением, которое хотите проверить, а затем сравните его со значением, которое вы хотите проверить.

Например, у вас может быть как сдвиг, так и нажата клавиша ctrl, поэтому значение в e.Modifier будет поразрядной комбинацией Keys.Shift и Keys.Ctrl. Итак:

e.Modifier == Keys.Shift

Является ложным. Shift удерживается нажатой, но Ctrl также удерживается нажатой. Если вы хотите узнать, удерживается ли Shift независимо от того, какие другие клавиши могут быть удержаны, вам нужно сначала отфильтровать все остальные ключи. Это легко сделать, используя Keys.Shift в качестве фильтра:

(e.Modifier & Keys.Shift) == Keys.Shift

Теперь это будет верно, если клавиша сдвига удерживается независимо от того, какие другие клавиши могут быть нажаты, а в противном случае - false.

Ответ 7

Часть 1

Это логический оператор И.

Используется, когда несколько флагов должны быть установлены в одном, например, Integer:

a, например, равно 3, что означает 00000011 в двоичной нотации. b, например, равно 2, что означает 00000010 в двоичной нотации.

Если вы хотите проверить, имеет ли флаг (второй бит справа), который b представляет, вы используете оператор AND:

a и b = 00000010

И когда это равно b (или > 0), вы знаете, что флаг установлен.

Часть 2

Оператор равенства также может использоваться для случая, когда вы хотите проверить, является ли "Keys.Shift" единственным ключом "модификатор", и никто не нажимает. Когда вы используете первый код, могут быть нажаты и другие клавиши "модификатор", и условие if будет по-прежнему истинным.

Ответ 8

Один амперсанд (&) выполняет битовую операцию И; двойной амперсанд (&) выполняет логическую операцию И.

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

1001 & 0001 = 0001
1101 & 1111 = 1101

Логическое И работает с двумя логическими значениями и возвращает логическое значение:

true && true = true
false && true = false

Короткое замыкание
Булева операция И (&) также может быть выполнена на двух выражениях, которые возвращают логическое значение:

int a = 5;
int b = 10;
bool result = (a < 3) && (b > 3);
// result will be false;

Поскольку первое выражение (a < 3) оценивается как false, результат не может быть true, потому что выражения BOTH должны оцениваться до true, чтобы результат был true. Из-за этого второе выражение даже не будет оценено. Это называется "короткое замыкание". Тем не менее, с помощью бит-операции И, оба выражения должны быть оценены до выполнения операции. Таким образом, в большинстве ситуаций, когда вы просто хотите определить, истинны ли две вещи (логические), логический И (& &) будет лучшим вариантом.

В вашем примере код сравнивает отдельные биты внутри e.Modifiers с отдельными битами в Keys.Shift. Ни один из аргументов не представляет собой логическое значение, и, следовательно, операция бит-мудрая (&), а не логическая (&).