Побитовые операции
Иногда приходится изменять значения отдельных битов в целых данных. Это выполняется с помощью побитовых (bitwise) операций путем наложения маски. В языке Java есть четыре побитовые операции:
дополнение (complement)
~
(тильда);
побитовая конъюнкция (bitwise AND)
&
;
побитовая дизъюнкция (bitwise OR)
|
;
побитовое исключающее ИЛИ (bitwise XOR)
^
.
Они выполняются поразрядно, после того как оба операнда будут приведены к одному типу
int
или
long
, так же как и для арифметических операций, а значит, и к одной разрядности. Операции над каждой парой битов выполняются согласно табл. 1.3.
Таблица 1.3.
Побитовые операции
nl |
n2 |
~nl |
nl & n2 |
nl | n2 |
nl ^ n2 | ||||||
1 1 0 0 |
1 0 1 0 |
0 0 1 1 |
1 0 0 0 |
1 1 1 0 |
0 1 1 0 |
В нашем примере
b1 == 50
, двоичное представление
00110010, b2 == -99
, двоичное представление
10011101
. Перед операцией происходит повышение до типа
int
. Получаем представления из 32-х разрядов для
b1 — 0...00110010
, для
b2 — 1...l0011101
. В результате побитовых операций получаем:
~b2 == 98
, двоичное представление
0...01100010
;
b1 & b2 == 16
, двоичное представление
0...00010000
;
b1 | b2 == -65
, двоичное представление
1...10111111
;
b1 ^ b2 == -81
, двоичное представление
1...10101111
.
Двоичное представление каждого результата занимает 32 бита.
Заметьте, что дополнение
~х
всегда эквивалентно
(-x)-1
.