Возможный дубликат:
Что такое побитовые операторы?
Недавно я наткнулся на несколько образцов, которые использовали | и ^. Я предполагаю, что это операторы or
и negation
.
Итак, что на самом деле стоят эти операторы?
Возможный дубликат:
Что такое побитовые операторы?
Недавно я наткнулся на несколько образцов, которые использовали | и ^. Я предполагаю, что это операторы or
и negation
.
Итак, что на самом деле стоят эти операторы?
Если вы применяете его к целочисленным типам, они являются побитовым или или оператором xor. Однако, если вы применяете их к логическим типам, они являются логическими и/или xor. Посмотрите объяснение или оператора и оператор xor
Вы можете получить более подробную информацию о логических операциях из таблицы таблицы истинности
|
= (побитовое/не короткое замыкание) "или" ^
= "xor" а для информации "нет" (побитовое отрицание) - ~
MSDN имеет документацию по всем операторам С# по адресу:
http://msdn.microsoft.com/en-us/library/6a71f45d.aspx
EDIT - Jon B прокомментировал, что соответствующая цитата из связанной документации будет полезна.
Двоичный | операторы предопределены для интегральных типов и bool. Для интегральных типов | вычисляет побитовое ИЛИ его операндов. Для операндов bool | вычисляет логический ИЛИ своих операндов; то есть результат является ложным тогда и только тогда, когда оба его операнда ложны.
^
- это Логический оператор XOR.
Операторы Binary ^ предопределены для интегральных типов и bool. Для интегральных типов ^ вычисляет побитовое исключающее ИЛИ своих операндов. Для операндов bool ^ вычисляет логическое исключение или его операнды; то есть результат верен тогда и только тогда, когда истинно один из его операндов.
это логические побитовые операторы
| это ссылка
^ - это XOR ссылка
С интегральными типами | является поразрядным или, ^ побитовым xor и для полноты и является поразменным и.
С булевыми типами | является булевым или, ^ булевым xor и булевым &.
Для сравнения, || является булевым замыканием или - если первый операнд оценивается как истинный, второй операнд не оценивается. && является булевым замыканием и - если первый операнд ложный, второй не оценивается. Нет короткого замыкания, потому что нет случая, когда второй не нужно оценивать.
|| и && чаще используются, чем | и в булевых случаях, так как обычно есть хотя бы крошечный выигрыш в эффективности и никогда не теряется. Однако, если правый операнд имел побочный эффект, что было важно вызвать во всех случаях, тогда | или он будет использоваться. На практике это редко, и плохой запах (если побочный эффект важен, его следует оценивать в отдельном выражении, чтобы сделать цель более ясной).
Edit: источник потенциальной путаницы, заключается в том, что в некоторых других языках интегральные типы могут использоваться в качестве логических элементов (например, вы можете сделать if(53)
и это то же самое, что и if(true)
), что делает различия между вышеупомянутыми операторами вполне different: Они одинаковы, если используется "чисто" булевский тип (который имеет только true и false как возможные значения), но не иначе. С# намеренно не позволяет логические операции с интегральными типами точно предотвращать возможности ошибок, существующих на таких языках.
^
Логический XOR
|
Логический OR
обновление
в С# также выполняет свои логические операции:
Console.WriteLine(true ^ false); // logical exclusive-or
Console.WriteLine(false ^ false); // logical exclusive-or