Каково второе значение одного амперсанда в 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. В любом случае он продолжает оценивать выражение.

то есть, есть два важных различия между & и &&:

  1. & работает бит за битом, в то время как && учитывает только ноль и ненулевые и всегда возвращает 0 или 1. Таким образом 5 & 6 (binary 101 & 110) дает 4 (binary 100), в то время как 5 && 6 дает 1 (true).

  2. && "короткое замыкание". Если первое значение равно нулю, оно не оценивает второе значение. и нет такого правила. Это важно в нескольких отношениях. Во-первых, если второе значение имеет какие-либо побочные эффекты, то с & эти побочные эффекты всегда происходят, в то время как С && они этого не делают. Таким образом," 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.


побитовое и оператор.