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

Facebooktwittergoogle_plustumblrFacebooktwittergoogle_plustumblr

В данной статье мы рассмотрим:

1. Что такое бит, история возникновения.

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

3.  + в конце статьи будет бонус 🙂

 

Что такое бит. История возникновения

Бит - это то, на чем строится работа каждого компьютера. Перед тем как объяснить в чем же заключается работа с битами в Java, немного истории!

Жил был такой ученый Готфрид Вильгельм Лейбниц.

leibnizvertex

Может кто-то знает его за многочисленные заслуги в математике и не только:

  • создание математического анализа - дифференциальное и интегральное исчисления;
  • создал комбинаторику как науку;
  • заложил основы математической логики;
  • в физике сформулировал закон сохранения энергии;
  • в психологии развил учение о бессознательной психической жизни;
  • и именно он описал двоичную систему счисления с цифрами 0 и 1.

Одним словом -  был серьезным ученым. И вот в 1703 году он описал двоичную систему исчисления с цифрами 0 и 1. В своей работе он упоминал, что двоичная система исчисления существовала в Китае много-много лет до того как он взялся за ее изучение. Она была описана великим Китайским императором и философом по имени Fu Xi (Фу Си), который жил еще более, чем за 4000 лет до Лейбница.

fuxi-vertex

Китайский император описывал Инь и Ян как инь-ян ("0"-"1"), китайский двоичный разряд, китайский бит. Другими словами можно сделать вывод, что двоичная система исчисления за долго до компьютеров уже имела огромную силу и большую историю!

bit-inyanvertex

Сегодня представление и обработка любой информации в компьютере представлена в виде двоичной системы исчислений. Сам бит - это единица измерения информации, 1 или 0, да или нет.

Всем известна Дездемона из пьесы Уильяма Шекспира "Отелло". И на вопрос "Молилась ли ты на ночь Дездемона?", она могла бы ответить вот таким способом:

bit

Тоесть, 1 это ДА, а 0 это НЕТ!

Любое число можно перевести в последовательность Битов!
Например:

  • число 0  - (представление в битах) 0 0
  • число 1  - (представление в битах) 0 1
  • число 2  - (представление в битах) 1 0
  • число 3  - (представление в битах) 1 1
  • число 4  - (представление в битах) 1 0 0
  • число 5  - (представление в битах) 1 0 1
  • число 6  - (представление в битах) 1 1 0
  • число 7  - (представление в битах) 1 1 1
  • число 8  - (представление в битах) 1 0 0 0
  • число 9  - (представление в битах) 1 0 0 1
  • число 10  - (представление в битах) 1 0 1 0
  • число 15  - (представление в битах) 1 1 1 1
  • число 20  - (представление в битах) 1 0 1 0 0
  • число 25  - (представление в битах) 1 1 0 0 1
  • число 31  - (представление в битах) 1 1 1 1 1

Компьютер хранит в своей памяти таким образом любые символы (цифры, буквы, знаки препинания и т.д.) и для этого использует определенное количество бит. Компьютер распознает 256 (от 0 до 255) различных символов по их коду, чтобы вместить все цифры, буквы и много других символов.

Для представления символа с максимальным кодом, то есть 255 - нужно 8 бит. Эти 8 бит называются байтом. Один любой символ - это всегда 1 байт.

Но вернемся к Java!

- Что можно делать с битами с помощью языка программирования Java?

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

Побитовые операции в Java можно проводить только над целочисленными типами данных. То есть long, int, short, char, byte.

Разница в работе с целочисленными значениями только в том сколько они хранят в себе диапазон допустимых значений.

Существуют следующие побитовые операторы в Java:

operators-bit-vertex1

operators-bit-vertex2

Побитовый унарный оператор NOT

bit-invers

Или

bit-invers2

Например:

Вывод:

bit-invers

Комментарии:

Уже говорилось, что число для компьютера -  это последовательность битов. А, значит, и следующие числа так же можно представить в виде последовательности битов:

Вывод:

Чтобы сделать инверсию - в числе (в представлении последовательности битов) каждый бит меняется на противоположный.

Но чтобы получить наше число правильно инвертированным, нужно к числу добавить 1.

Побитовый AND

Как заметно, побитовая операция AND, не равна арифметической операции "плюс"!

bit

Другими словами 1(правда) выйдет только тогда когда обе части правда (1 & 1 - оба правда).

Например:

Вывод:

Побитовый OR

bitor

Другими словами, если хоть одна часть правда, тогда все правда (0 | 1 → 1).

Например:

Вывод:

Побитовый исключающее OR - XOR

bitxor

bitxor1

Другими словами, обе части должны отличаться друг от друга (0 ^ 1 → 1) но (1 ^ 1 → 0).

Например:

Вывод:

Сдвиг вправо vs Сдвиг влево

bit2vertex

Двойка правит миром!

Конечно это шутка, но в каждой шутке есть доля шутки, а все остальное правда. С побитовыми сдвигами именно такая ситуация. При сдвиге бита вправо или влево, по сути Вы умножаете или делите число на 2. Есть, конечно, свои нюансы, но сначала пример.

Сдвиг влево

Например:

Вывод:

Другими словами видно что бит "1", каждый раз сдвигается влево и доставляет справа бит "0".

Сдвиг вправо

Например:

Вывод:

Другими словами видно что бит "1" каждый раз сдвигается вправо и убирает справа бит "0".

А что если другие числа не кратные двум? В таком случае, если число нацело не делится, тогда оно уменьшается на остаток от деления или на единицу, чтобы таким образом трансформироваться в кратное двум! Возьмем число 35 к примеру.

Сдвиг вправо

Например:

Вывод:

Видно, что биты справа просто исчезают. А так же важно заметить, что когда число равно нулю, в таком случае при побитовом сдвиге вправо число останеться нулем!

Сдвиг влево

Например:

Вывод:

Видно, что биты справа просто добавляются. А так же важно заметить, что любое число, умноженное на два, обязательно кратное двум!

Еще расмотрим как ведет себя сдвиг вправо при отрицательных числах:

Например:

Вывод:

Так же, как и при положительных числа, только сохраняя свой знак "-".

Сдвиг вправо с заполнением нулями

Но в случае когда не нужно придерживаться знака "-", можно использовать  сдвиг вправо с заполнением нулями ">>>" и в таком случае знак "-" исчезает.

Например:

Вывод:

Здесь видно, что знак "-" не сохраняется, тогда берется самое большое значение из допустимых в типе int и дальше все по старинке!

Внимание: необходимо аккуратно работать с разными типами данных в java. Типы данных byte и short приводятся автоматически к int.

Бонус!

Научимся с последовательности битов быстро получать числа! Для того, чтобы это выходило быстро, нужно выучить числа двойки в степени.

stepen2

Посмотрим числа 2, 4, 8 - записываются в двоичной системе.

bitindexvertex

А теперь переведем число с двоичной в десятичную систему:

bitssearch

  1. Возьмите любое число, написанное с помощью двоичной системы исчисления.
  2. Там где ноль, всегда будет ноль.
  3. А там где единица - нужно поднести двойку в индекс, где находится единица.
  4. Просуммировать все эти числа!

Вуаля!


Надеемся, что наша статья была Вам полезна. Также есть возможность записаться на наши курсы по Java в Киеве. Обучаем с нуля. Детальную информацию Вы можете найти у нас на сайте.

Facebooktwittergoogle_plustumblrFacebooktwittergoogle_plustumblr

Facebooktwittergoogle_plustumblrFacebooktwittergoogle_plustumblr
Самоучители--узнать детальнее--