Я лично , как исключающие или , ^
, оператор , когда это имеет смысл в контексте логических проверок из - за свою лаконичность. Я предпочитаю писать
if (boolean1 ^ boolean2)
{
//do it
}
чем
if((boolean1 && !boolean2) || (boolean2 && !boolean1))
{
//do it
}
но меня часто смущают взгляды других опытных разработчиков Java (не только новичков), а иногда и комментарии о том, как его следует использовать только для побитовых операций.
Мне любопытно, что касается лучших практик использования ^
оператора.
bool1 ^ bool2 ^ bool3
Имеет для меня более логичный смысл, чемbool1 != bool2 != bool3
!=
дает правильные результаты дляboolean
s (но не дляBoolean
s, поэтому будьте осторожны). Это не всегда красиво, например(some != null) != (other != null)
, не очень читабельно. Вы должны либо извлечь части в явных логических значениях, либо извлечь!=
их отдельным методом.a ^ b
=> "a или b, но не оба",a != b
=> "a не равно b". (Что сказал @RobertGrant). Большинству людей было бы легче понять первое, если бы они знали, что такое xor (что очень полезно знать, если вы работаете в области вычислительной техники ...)a != b
=> «а не является ИДЕНТИЧНЫМ для б»Я думаю, что вы ответили на свой собственный вопрос - если вы получаете странные взгляды от людей, возможно, безопаснее пойти с более явным вариантом.
Если вам нужно это прокомментировать, то вам, вероятно, лучше заменить его более подробной версией и не заставлять людей задавать вопрос в первую очередь.
источник
(boolean1 && !boolean2) || (boolean2 && !boolean1)
в реальном коде приложения ...Я нахожу, что у меня много подобных разговоров. С одной стороны, у вас есть компактный, эффективный метод достижения вашей цели. С другой стороны, у вас есть кое-что, что остальная часть вашей команды может не понять, что затруднит его сохранение в будущем.
Мое общее правило - спрашивать, является ли используемая методика разумной для программистов. В этом случае я думаю, что разумно ожидать, что программисты будут знать, как использовать логические операторы, поэтому использование xor в операторе if - это нормально.
В качестве примера чего-то, что не было бы хорошо, возьмите хитрость использования xor для замены двух переменных без использования временной переменной. Это хитрость, с которой я не ожидал бы, что все будут знакомы, поэтому она не прошла бы проверку кода.
источник
Я думаю, что было бы хорошо, если бы вы это прокомментировали, например
// ^ == XOR
.источник
Вы всегда можете просто обернуть его в функцию, чтобы дать ему подробное имя:
Но мне кажется, что для любого, кто не знал, что оператор ^ для Google, это было бы не сложно, это действительно быстро. Это не будет трудно вспомнить после первого раза. Поскольку вы запрашивали другие варианты использования, для использования битовой маскировки обычно используется XOR.
Вы также можете использовать XOR для замены значений в двух переменных без использования третьей временной переменной .
Вот вопрос Stackoverflow, связанный с заменой XOR .
источник
Недавно я использовал xor в проекте JavaScript на работе и добавил 7 строк комментариев, чтобы объяснить, что происходит. Обоснование использования XOR в этом контексте было то , что одним из условий (
term1
в приведенном ниже примере) может взять на себя не два , а три значения:undefined
,true
или вfalse
то время как другие (term2
) может бытьtrue
илиfalse
. Я должен был бы добавить дополнительную проверку дляundefined
случаев, но с xor, следующего было достаточно, поскольку xor заставляет первый член сначала быть оценен как логическое значение, позволяяundefined
обрабатываться какfalse
:В конце концов, это было немного излишним, но я все равно хотел оставить его там, как пасхальное яйцо.
источник
bool? a
значение может быть явно проверено на истинное использованиеa == true
- есть ли подобный метод в Java? В C #, учитывая дваbool?
значения, «обрабатывать ноль как ложь» приведет к(a == true) ^ (b == true)
. Эквивалентная формула(a == true) != (b == true)
. Можете ли вы сделать что-то подобное в Java?ИМХО этот код можно упростить:
источник
Учитывая ясность кода, я считаю, что использование XOR в логических проверках не является типичным использованием побитового оператора XOR. Из моего опыта побитовый XOR в Java обычно используется для реализации
flag toggle
поведения маски :Эта статья Випана Сингла объясняет случай использования более подробно.
Если вам нужно использовать побитовый XOR, как в вашем примере, прокомментируйте, почему вы его используете, поскольку, вероятно, потребуется даже побитовая грамотная аудитория, чтобы остановиться, чтобы понять, почему вы ее используете.
источник
Я лично предпочитаю выражение "boolean1 ^ boolean2" из-за его краткости.
Если бы я был в вашей ситуации (работая в команде), я бы пошел на компромисс, заключив логику «boolean1 ^ boolean2» в функцию с описательным именем, таким как «isDifferent (boolean1, boolean2)».
Например, вместо использования «boolean1 ^ boolean2», вы бы назвали «isDifferent (boolean1, boolean2)» следующим образом:
Ваша функция isDifferent (boolean1, boolean2) будет выглядеть так:
Конечно, это решение влечет за собой использование якобы постороннего вызова функции, который сам по себе подлежит проверке Best Practices, но он избегает многословного (и уродливого) выражения "(boolean1 &&! Boolean2) || (boolean2 &&! Boolean1) «!
источник
Если модель использования оправдывает это, почему бы и нет? Хотя ваша команда не сразу узнает оператора, со временем они могут. Люди постоянно учат новые слова. Почему не в программировании?
Единственное предостережение, которое я могу заявить, это то, что у «^» нет семантики короткого замыкания вашей второй логической проверки. Если вам действительно нужна семантика короткого замыкания, тогда работает статический метод util.
источник
xor
, которая делает именно то, что делает оператор xor, но окольным путем, вызовет у меня больше вопросов (особенно о компетенции), чем программист, который только что использовал^
.! = можно сравнить две переменные. Это не работает, однако, с несколькими сравнениями.
источник
Как побитовый оператор, xor намного быстрее, чем любой другой способ его замены. Поэтому для критичных к производительности и масштабируемых вычислений xor является обязательным условием.
Мое субъективное личное мнение: категорически запрещается использовать равенство (== или! =) Для логических значений. Его использование показывает отсутствие базовой этики и основ программирования. Любой, кто дает вам запутанные взгляды на ^, должен быть возвращен к основам булевой алгебры (у меня было искушение написать «рекам веры» здесь :)).
источник
выглядит лучше для меня, чем
источник