Операции сдвига применяются только к переменным целого типа. Эти операции предназначены для сдвига с учетом знака влево (<<) или вправо (>>) на число бит, указанное после оператора. Java также добавлен беззнаковый сдвиг вправо >>>, который использует дополнение нулями: независимо от знака, в старшие биты вставляются нули.
Если вы сдвигаете char, byte или short, это переводится в int перед сдвигом, а результат будет типа int. Будут использоваться только пять младших бит с правой стороны. Это предохранит вас от сдвига на болешее число бит, чем есть в int. Если вы работаете с long, в результате вы получите long. Будут использоваться только шесть младших бит с правой стороны, так что вы не сможете сдвинуть на большее число бит, чем есть в long.
Сдвиг может быть скомбинирован со знаком равенства (<<= или >>= или >>>=). Однако, если это применяется к byte или short, корректный результат не будет получен. Происходит преобразование к int и правый сдвиг, далее происходит усечение, так как результат снова присваивается к той же переменной, так что в этих случаях вы получите -1.
Тернарный оператор ?:
Этот оператор используется в выражениях с тремя операндами.. Выражение имеет форму:
boolean_выражение ? значений_1 (если true) : значение_2 (если false)
Если boolean-выражение принимает значение true, вычисляется значение_1, иначе вычисляется значение_2. Вычисленное значение становится результатом операции. Например:
static int func(int n)
{ return n <5 ? i +5 : i -5;
}
Этот код более компактный, чем написанный без использования тернарного оператора:
static int func(int n) {
if (n < 5) return n +5;
else return n-5;
}