Каково второе значение одного амперсанда в C#?
я использовал один амперсанд ( & ) в C#, чтобы означать "проверьте второй условное утверждение, даже если первое false".
но следующий, кажется другое значение of &
в целом, может ли кто-нибудь объяснить, как i & 1
работает в следующем примере?
List<int> scores = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8 };
var evenScores = scores.Where(i => i % 2 == 0);
var evenScores2 = scores.Where(i => (i & 1) == 0);
6 ответов
один & является "побитовым и оператором", как и голубь - сказал. Я смотрю на вторую часть вопроса: "почему это работает?"
думаю, что в двоичном виде:
000 = 0
001 = 1
010 = 2
011 = 3
100 = 4
101 = 5
110 = 6
111 = 7
and so on
обратите внимание, что все четные числа заканчиваются на 0; поэтому, если последняя побитовая проверка против 1 возвращает ноль (что означает "не соответствует"), его четное число;
унарный
& operator
возвращает адрес своего операнда (требуетсяunsafe
контексте).Бинарные
& operators
предопределены для интегральных типов и bool. Для интегральных типов,&
вычисляет логическое побитовоеAND
его операндов. Для операндов типа bool,&
вычисляет логическоеAND
его операндов; то есть результат истинен тогда и только тогда, когда оба его операнда истинны.The
& operator
вычисляет оба оператора независимо от значения первого.
предыдущие ответы верны, но не обращаются к тому, как & отличается от&&, который я думал, был вашим первоначальным вопросом, поэтому я возьму это.
Как уже было сказано, " & "является побитовым и. "&&"- это логическое и. & выполняет операцию AND на своих операндах бит за битом, и в общем случае функции точно такие же, как плюс или раз или любой арифметический оператор. & и более сложные. If сравнивает каждый из своих операндов с нулем. Если первый операнд равен нулю, он принимает значение FALSE и короткие замыкания остальная часть выражения, т. е. она не оценивает оставшиеся операнды. Если первое значение не равно нулю, оно проверяет второе значение. Если это ноль, он принимает значение false, в противном случае он принимает значение true. В любом случае он продолжает оценивать выражение.
то есть, есть два важных различия между & и &&:
& работает бит за битом, в то время как && учитывает только ноль и ненулевые и всегда возвращает 0 или 1. Таким образом 5 & 6 (binary 101 & 110) дает 4 (binary 100), в то время как 5 && 6 дает 1 (true).
&& "короткое замыкание". Если первое значение равно нулю, оно не оценивает второе значение. и нет такого правила. Это важно в нескольких отношениях. Во-первых, если второе значение имеет какие-либо побочные эффекты, то с & эти побочные эффекты всегда происходят, в то время как С && они этого не делают. Таким образом," x & (y++) "всегда будет увеличивать y, а" x && (y++) " будет увеличивать y, только если x не равно нулю. Это становится более важным -- и, возможно, более тонкий - если второй операнд является вызовом функции. Во-вторых, первое значение может проверить то, что определяет недопустимость второго значения. Типа " x!=NULL & & x - >foo==3". С &, когда x равно null, что может бомбить с ошибками сегмента или эквивалентом. И в-третьих, может быть достигнут значительный прирост производительности. Жизнь", Икс!='A' & & readTonsOfStuffFromDatabaseAndCalculatetotal (x)". С &, чтение произойдет независимо, и, возможно, будет полной тратой время.
вот почему мы почти всегда используем && для вещей, которые действительно являются логическими операциями, и ограничиваем использование&, когда мы действительно хотим немного мудрой операции. Но бывают случаи, когда вы не хотите, чтобы короткое замыкание произошло, и в этом случае & может быть хорошим выбором. Но если вы используете его для работы "логически", будьте очень осторожны с операндами, которые могут иметь любые значения, отличные от 0 или 1. 1 & & 2 истинно, но 1 & 2 ложно.
для логических типов вы упомянули, как он ведет себя.
для целых типов это побитовый оператор "и".
Он может быть перегружен для других типов.
в принципе, выражение (i & 1) == 0
проверяет, является ли наименьший значащий бит i
устанавливается, что происходит, только если число нечетное.
амперсанд представляет побитовое и операции. Побитовый оператор возвращает результат сравнения между каждым соответствующим битом в двух операндах.
например, если x-0110, а y-1010, то побитовое и x и y (x & y) приводит к 0010.