JavaRush /Курсы /Java Syntax Pro /Побитовые операции в Java

Побитовые операции в Java

Java Syntax Pro
8 уровень , 4 лекция
Открыта

1. Побитовый оператор AND

Когда-то мы говорили, что все данные хранятся в памяти в двоичной системе. Поэтому довольно давно программисты придумали много чего интересного для работы с двоичным представлением чисел. Например, в Java есть логические операторы, которые работают с битами чисел: AND (И), OR (ИЛИ), NOT (НЕ) и XOR (исключающее или).

a & b
Побитовый оператор AND (И)

Данный оператор очень похож на логический оператор AND (И), только обозначается не двумя амперсандами, а одним:

И применяется он не к числу в целом, а к его битам: число рассматривается как массив бит, и i-й бит числа-результата вычисляется на основе i-х бит каждого из двух чисел.

Первый бит результата будет вычисляться на основе первого бита числа a и первого бита числа b, второй бит — на основе второго бита числа a и второго бита числа b, и т.д.

Ну а оператор AND (И) означает, что «результирующий бит равен единице, только если бит числа a равен единице И бит числа b равен единице»:

1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0

Примеры:

Пример Результат
0b0011 & 0b1010
0b0010
0b1111 & 0b0000
0b0000
0b1010 & 0b0101
0b0000
0b1111 & 0b1010
0b1010

2. Побитовый оператор OR

Данный оператор очень похож на логический оператор OR (ИЛИ), только обозначается уже не двумя вертикальными линиями, а одной:

a | b

Также он применяется не к числу в целом, а к его битам: i-й бит числа-результата вычисляется на основе i-х бит каждого из двух чисел.

Побитовый OR (ИЛИ) означает, что «результирующий бит равен единице если бит числа a равен единице ИЛИ бит числа b равен единице»:

1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0

Примеры:

Пример Результат
0b0011 | 0b1010
0b1011
0b1110 | 0b0000
0b1110
0b1010 | 0b0101
0b1111
0b1111 | 0b1010
0b1111

Только когда биты обоих чисел (стоящие на одинаковых позициях) равны нулю, соответствующий бит результата равен нулю.



3. Побитовый оператор XOR (ИСКЛЮЧАЮЩЕЕ ИЛИ)

Оператор XOR, его еще называют исключающее или, обозначается символом ^. Чтобы ввести его на клавиатуре, нужно нажать shift+6 (в английской раскладке).

a ^ b

Данный оператор чем-то похож на оператор OR, (он даже называется похоже — XOR)

Побитовый XOR (ИСКЛЮЧАЮЩЕЕ ИЛИ) означает, что «результирующий бит равен единице, если бит числа a равен единице ИЛИ бит числа b равен единице, но не оба одновременно»:

1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0

Примеры:

Пример Результат
0b0011 ^ 0b1010
0b1001
0b1110 ^ 0b0000
0b1110
0b1010 ^ 0b0101
0b1111
0b1111 ^ 0b1010
0b0101

Только когда биты обоих чисел (стоящие на одинаковых позициях) разные, соответствующий бит результата равен единице. Если биты одинаковые, результирующий бит равен нулю.



4. Побитовый оператор NOT (НЕ, ОТРИЦАНИЕ)

Думаю, вы уже догадываетесь, что он означает. Данный оператор очень похож на логический оператор NOT (НЕ), только обозначается уже не восклицательным знаком, а тильдой:

~a

Этот оператор унарный: применяется не к двум числам, а к одному, перед которым и ставится.

Побитовый NOT означает, что «результирующий бит равен единице, если бит числа a равен нулю, и равен нулю, если бит числа a равен единице»:

~1 = 0
~0 = 1

Примеры:

Пример Результат
~0b0011
0b1100
~0b0000
0b1111
~0b0101
0b1010
~0b1111
0b0000

Данный оператор просто меняет бит 1 на 0 и 0 на 1.


Комментарии (418)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
rubenchik Уровень 10
2 ноября 2024
public void swap() { int fix; fix = x; x = y; y = fix; }
AlexGarag Уровень 17
28 октября 2024
Один из способов зашифровать-расшифровать
Artem Уровень 11
26 октября 2024
Задачка Swap меня поставила в тупик. В голову ни одна мысля не лезла. Полез читать коменты, огромное спасибо товарищу с ником Andrey. Я также нарисовал на бумаге все единицы и нули и только после этого понял как работает XOR. Может это я такой деревянный, но я не знаю как можно было додуматься до такого решения самостоятельно не зная его.
Andrey Уровень 23
15 октября 2024
swap по-новому...Первый раз в жизни не поверил компьютеру, стал рисовать нолики и единички в клеточках на бумаге..и ДА ЭТО РЕАЛЬНО ТАК! X = X ^ Y (В Х результат совместного ксора х и у) Y = X ^ Y (Этот совместный результат поксоренный с у дает Х) !!! X = X ^ Y(Этот совместный результат поксоренный с новым Y дает старый Y) 🤯 Ну как так-то????!!!!!!!
Andrey Уровень 23
14 октября 2024
JAVA: Меняем переменные местами через XOR в двух классах PYTHON: a, b = b, a (Ну это все...) 😂 РЖУНИМАГУ ЗЫ..Ну алгоритм и правда очень оригинальный и изящный..если не знать не додумаешься)
Andrey Уровень 23
14 октября 2024
А вот эта первая с побитовыми операциями..забавная..как игра..не могу вспомнить, но что-то мне это напоминает...
SensNyaha Уровень 35
10 октября 2024
На самом деле, когда начинаешь втягиваться в программирование - очень тяжело понять, зачем могут понадобиться побитовые операции. Однако тут всё связано с разделом применения знаний. Базовое понимание побитовых операций должен быть у каждого человека, работающего со счётными устройствами. Как минимум, напоминает о том, как можно работать с получаемой информацией в том виде, в котором её воспринимает железо. Как максимум, круто помогает в разных сферах прикладных знаний. Начиная от разбора кадра данных от какого-нибудь замудрёного устройства при работе в сфере АСУТП, заканчивая снижением накладных затрат на высылку 100500 булевых тегов по сети с их заменой на какой-нить набор uint8 тегов, где 64 вакантных позиции для выдаче логической информации. Сам по образованию химик, знакомился с айти через JS и при первых изучениях, конечно, эту инфу откидывал как ненужную, а на самом деле много раз стрельнуло при последующих прикладных задачах.
Андрей Уровень 22
25 сентября 2024
Swap - хорошая задача, не знал, что есть такой алгоритм.
Rustam Уровень 22 Student
22 сентября 2024
Самая сложная тема для меня в Java. Но все равно интересно
Deus Vult Уровень 16
19 сентября 2024
какая-то рандомная хрень просто вылезла без объяснений зачем, почему. На, решай в двоичной системе. идиотизм.
alexxxnice Уровень 11
20 октября 2024
А мне попадалось на практике в качестве побитовых масок. Сервер присылал в одном целочисленном значении рандомный набор от 1 до 4 масок, соответственно извлекать их надо было с помощью побитовой операции И.