В чем смысл оператора &? - PullRequest
       14

В чем смысл оператора &?

5 голосов
/ 15 марта 2009

В следующем коде:

Expression<Func<int, bool>> isOdd = i => (i & 1) == 1;

... в чем смысл (i & 1) == 1?

Ответы [ 4 ]

12 голосов
/ 15 марта 2009

Побитовое И . В этом случае проверяется, установлен ли последний бит в i. Если это так, это должно быть нечетное число, поскольку последний бит представляет 1, а все остальные биты представляют четные числа.

4 голосов
/ 15 марта 2009

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

И означает «если включены и А, и В». Пример реального мира - два переключателя в серии. Ток будет проходить только в том случае, если оба позволяют току проходить.

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

При применении к целым числам каждый бит в одном числе объединяется с каждым битом в другом числе. Таким образом, чтобы понять побитовый оператор AND, вам необходимо преобразовать числа в двоичные, а затем выполнить операцию AND для каждой пары совпадающих битов.

Вот почему:

00011011 (odd number)
AND
00000001 (& 1)
== 
00000001 (results in 1)

Принимая во внимание

00011010 (even number)
AND
00000001 (& 1)
==
00000000 (results in 0)

Поэтому операция (& 1) сравнивает самый правый бит с 1, используя логику AND. Все остальные биты фактически игнорируются, потому что ничто и ничто не ничто.

Это эквивалентно проверке, является ли число нечетным числом (все нечетные числа имеют самый правый бит, равный 1).

Вышеприведенный текст адаптирован из аналогичного ответа, который я написал на этот вопрос .

4 голосов
/ 15 марта 2009

'&' - это бит и оператор . & 'с 1 удаляет все остальные двоичные цифры, оставляя 0, если число четное, и 1, если оно нечетное.

Это способ хакера сделать это. Математик, конечно, вместо этого пишет ((i% 2) == 1), используя по модулю 2 арифметика ! В то время как инженер-программист написал бы! IsEven (i), повторно используя библиотечную функцию и зарабатывая очки повторного использования ...: -)

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

2 голосов
/ 15 марта 2009

Это проверка, включен ли последний бит (что делает его нечетным). Обратите внимание, что это не относится к linq, вы можете сделать это с помощью кода sql или c #.

...