if(0 != ((a > b) ? 1 : 0) & ((c < d) ? 1 : 0)) {
// but really... (a > b) && (c < d), assuming no side-effects
}
... просто используйте логические операторы (&&
и ||
) для условий; -) Это то, для чего они были предназначены для, Если требуется не короткое замыкание, измените код соответствующим образом.
Мне кажется, я видел один случай, в котором в некотором смысле использовалось &
, но я не помню, что это было, поэтому я не нашел его действительным ;-) В таких языках, как C / В C ++, где нет дискретного «логического» типа, (вход) и результат &
могут быть обработаны так, что 0 -> false
и non-0 -> true
. Как можно видеть, однако, Java должен перепрыгнуть через некоторое удовольствие, чтобы получить bool -> int -> bool
.
Единственное оправдание для побитового оператора это, ну, в общем, побитовые операции, IMOHO. Побитовые операторы наиболее полезны при выполнении какого-либо кодирования, включая «битовые поля» и «битовые маски». Они также полезны, когда имеешь дело с забавой, возникающей из байтов только для подписи Java и т. Д.
Я думаю, что большую (единственную?) Точку, которую нужно убрать, это то, что &&
и ||
имеют короткое замыкание - они на самом деле только операторы с таким поведением (аргументы более ?:
исключены); остальное - просто объяснить нетерпеливое поведение побитовых операторов. Это только усиливает правило: не вызывает побочных эффектов в условных выражениях (за исключением нескольких общепринятых идиом, но даже в этом случае сделайте его простым).
Счастливого кодирования.
Примеры побитового использования:
Представьте себе использование флагов, которые хранятся в одном «целочисленном» слоте в сериализованном формате:
int flags = 0;
if (this.encypted) {
flags |= EncryptedMode;
}
out.write(flags);
// later on
int flags = in.readInt();
this.encrypted = (flags & EncryptedMode) != 0;
Чтение "значения без знака" байта:
byte[] data = {-42, ...}; // read in from file or something
int unsignedByte = data[0] & 0xFF;