Работая с любыми целочисленными типами, можно применять операции, непосредственно обрабатывающие биты, из которых состоят целые числа. Это значит, что для определения состояния отдельных битов числа можно использовать маски.
В языке Java есть следующие битовые операции: &(«и»), |(«или»), ^(«исключающие или»), ~(«не»). Например, если n — это целое число, то приведенное ниже выражение равно единице только в том случае, если четвертый бит в двоичном представлении числа равен единице.
1 |
int fourthBitFromRight = (n & 8) / 8; |
Используя операцию & в сочетании с соответствующей степенью двойки, можно замаскировать все биты, кроме одного.
В применении к логическим переменным операции & или | дают логические значения. Эти операции аналогичны операциям && или ||, за исключением того, что вычисление производится по полной схеме, то есть обрабатываются все элементы выражения.
В языке Java есть также операции >> и <<, сдвигающие битовые представление числа вправо и влево. Эти операции удобны, если нужно построить битовое представление на основе маски:
1 |
int fourthBitFormRight = (n & (1 << 3)) >> 3; |
Имеется даже операция >>>, заполняющая старшие разряды нулями, в то время как операция >> восстанавливает в старших разрядах знаковый бит. Операция вроде <<< в языке Java нет на данный момент.
Значение, присутствующее в правой части операций битового сдвига, сокращается по модулю 32(если левая часть является числом типа long, правая часть сокращается по модулю 64). Например, значение выражения 1<<35 эквивалентно выражению 1<<3, или 8.
В языках C/C++ не определено, какой сдвиг выполняет операция >>: арифметический(при котором знаковый бит восстанавливается) или логический(при котором старшие разряды заполняются нулями). Разработчики средств реализации языка могут выбрать тот вариант, который покажется им более эффективным. Это значит, что результат выполнения операции сдвига вправо в языке C/C++ определен лишь для неотрицательных чисел. В языке Java эта неоднозначность удалена.
Видео по теме: