Один амперсанд (&) выполняет побитную операцию И; двойной амперсанд (& &) выполняет логическую операцию И.
Побитно и выполняет операцию И на каждом бите обоих аргументов (следовательно, он называется «бит-мудрый»). Таким образом, вывод битовой операции И (или любой побитовой операции) не будет логическим значением. Вот некоторые примеры побитового И операции:
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
, потому что оба выражения должны оценить, чтобы true
для того, чтобы в результате быть true
. Из-за этого второе выражение даже не будет оценено. Это называется «короткое замыкание». Тем не менее, с помощью бит-операции И, оба выражения должны быть оценены до выполнения операции. Таким образом, в большинстве ситуаций, когда вы просто хотите определить, истинны ли две вещи (логические), логический И (& &) будет лучшим вариантом.
В вашем примере код сравнивает отдельные биты в пределах e.Modifiers
с отдельными битами в Keys.Shift
. Ни один из аргументов не представляет собой логическое значение, и, следовательно, операция побито (&), а не boolean (& &).
Google «побитовое И», а затем «бит-флаг Google». – mbeckish
Возможный дубликат [Что делает сингл | или означает?] (http://stackoverflow.com/questions/9736751/what-does-a-single-or-mean) –